আরগপার্সে alচ্ছিক অবস্থানগত যুক্তি?


651

আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা বোঝাতে চাইছে: usage: installer.py dir [-h] [-v]

dir এটি একটি অবস্থানগত যুক্তি যা এর মতো সংজ্ঞায়িত হয়:

parser.add_argument('dir', default=os.getcwd())

আমি চাই diralচ্ছিক হতে: যখন এটি নির্দিষ্ট করা না হয় এটি ঠিক হওয়া উচিত cwd

দুর্ভাগ্যক্রমে যখন আমি dirযুক্তিটি নির্দিষ্ট না করি, আমি পাই Error: Too few arguments

উত্তর:


825

ব্যবহার করুন nargs='?'(বা nargs='*' যদি আপনার একাধিক দিরের প্রয়োজন হয়)

parser.add_argument('dir', nargs='?', default=os.getcwd())

বর্ধিত উদাহরণ:

>>> import os, argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-v', action='store_true')
_StoreTrueAction(option_strings=['-v'], dest='v', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
>>> parser.add_argument('dir', nargs='?', default=os.getcwd())
_StoreAction(option_strings=[], dest='dir', nargs='?', const=None, default='/home/vinay', type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args('somedir -v'.split())
Namespace(dir='somedir', v=True)
>>> parser.parse_args('-v'.split())
Namespace(dir='/home/vinay', v=True)
>>> parser.parse_args(''.split())
Namespace(dir='/home/vinay', v=False)
>>> parser.parse_args(['somedir'])
Namespace(dir='somedir', v=False)
>>> parser.parse_args('somedir -h -v'.split())
usage: [-h] [-v] [dir]

positional arguments:
  dir

optional arguments:
  -h, --help  show this help message and exit
  -v

14
কি ?এবং *একই জিনিস তারা রেগুলার এক্সপ্রেশনের (অর্থাত অর্থ মানে ?0 অথবা 1 এবং প্রয়োজন *0 প্রয়োজন বা তার বেশি)? যদি তাই হয়, +পাশাপাশি কাজ করে ?
দোলন অ্যান্টুচ্চি


2
alচ্ছিক যুক্তি দেখানোর জন্য dir পেতে কিছু উপায় আছে? বা মনে হয় অবস্থানগত আর্গুমেন্টগুলির একটি পূর্ববর্তী 'alচ্ছিক' বাছাই করা উচিত। এটি যেমন নিবন্ধকরণ করা সম্ভব (যতদূর সাহায্যের সাথে সম্পর্কিত) এটি কী?
স্ক্যাগনেটি

6
@ এবং উপরের দিক থেকে আপনি দেখতে পাচ্ছেন যে ডিয়ারটি isচ্ছিক (এটি আরগপার্স আউটপুটে বর্গাকার বন্ধনীগুলিতে প্রদর্শিত হয় এটি ইঙ্গিত করে)।
বিনয় সাজিপ

1
TX! দির থেকে প্রবেশ করুন options.dir, না args.dir, যেমন আমি চেষ্টা করছিলাম!
পিটিএম

69

@ VinaySajip উত্তরের একটি এক্সটেনশন হিসাবে। উল্লেখযোগ্য অতিরিক্ত আছেnargs

  1. parser.add_argument('dir', nargs=1, default=os.getcwd())

এন (একটি পূর্ণসংখ্যা) কমান্ড লাইন থেকে এন আর্গুমেন্টগুলি একটি তালিকায় একত্রিত হবে

  1. parser.add_argument('dir', nargs='*', default=os.getcwd())

'*'। উপস্থিত সমস্ত কমান্ড-লাইন আর্গুমেন্ট একটি তালিকাতে জড়ো করা হয়েছে। মনে রাখবেন যে এটির সাথে nargs='*'একাধিক অবস্থানিক তর্ক যুক্ত করার সাথে সাধারণত কোনও তাত্পর্য হয় না , তবে এর সাথে একাধিক alচ্ছিক যুক্তিগুলি nargs='*'সম্ভব।

  1. parser.add_argument('dir', nargs='+', default=os.getcwd())

+ '। ঠিক '*' এর মতো উপস্থিত সমস্ত কমান্ড-লাইন আরগগুলি একটি তালিকাতে জড়ো করা হয়। অতিরিক্তভাবে, যদি কমপক্ষে একটি কমান্ড-লাইন আর্গুমেন্ট উপস্থিত না থাকে তবে একটি ত্রুটি বার্তা উত্পন্ন হবে।

  1. parser.add_argument('dir', nargs=argparse.REMAINDER, default=os.getcwd())

argparse.REMAINDER। সমস্ত কমান্ড-লাইন আর্গুমেন্ট একটি তালিকাতে জড়ো করা হয়। এটি কমান্ড লাইন ইউটিলিটিগুলির জন্য সাধারণত কার্যকর যা অন্যান্য কমান্ড লাইন ইউটিলিটিগুলিতে প্রেরণ করে

যদি nargsকীওয়ার্ড আর্গুমেন্ট সরবরাহ না করা হয়, তবে সেগুলি দ্বারা আর্গুমেন্টের সংখ্যা নির্ধারিত হয়। সাধারণত এর অর্থ একটি একক কমান্ড-লাইন আর্গুমেন্ট গ্রাস হয়ে যাবে এবং একটি একক আইটেম (তালিকা নয়) উত্পাদিত হবে।

সম্পাদনা করুন (@Acumenus দ্বারা একটি মন্তব্য থেকে অনুলিপি করেছে) nargs='?' ডক্স বলে, '?'। সম্ভব হলে কমান্ড লাইন থেকে একটি যুক্তি গ্রাস করা হবে এবং একক আইটেম হিসাবে উত্পাদিত হবে। যদি কোনও কমান্ড-লাইন আর্গুমেন্ট উপস্থিত না থাকে তবে ডিফল্ট থেকে মান উত্পাদিত হবে।


3
এটি লক্ষ করা উচিত তবে এটি nargs='?'তালিকা তৈরি করে না।
একিউম্যানাস

@ এ বি বি উত্তরের শেষ লাইন Generally this means a single command-line argument will be consumed and a single item (not a list) will be produced.আশা করি এটি সাহায্য করবে ...
মাতাস ভাইটকেভিচিয়াস

1
উদ্ধৃত লাইনটি সংজ্ঞা না দেওয়ার ক্ষেত্রে বোঝায় nargs, তবে nargs='?'এটি সংজ্ঞা দিচ্ছে । ডক্স বলে, '?'। একটি যুক্তি সম্ভব হলে কমান্ড লাইন থেকে গ্রাস করা হবে এবং একক আইটেম হিসাবে উত্পাদিত হবে। যদি কোনও কমান্ড-লাইন আর্গুমেন্ট উপস্থিত না থাকে তবে ডিফল্ট থেকে মান উত্পাদিত হবে।
একিউম্যানাস

@ এএবিবি যদি মনে করেন যে কিছু অনুপস্থিত রয়েছে তবে উত্তরটি সম্পাদনা করুন। ধন্যবাদ।
মাতাস ভাইটকেভিচিয়াস

nargs=argparse.REMAINDERএবং এর মধ্যে পার্থক্য কী nargs='*', যা আমার কাছে মনে হয়, সেগুলি তাদের প্রভাবের ক্ষেত্রে অভিন্ন (পাইথন ২...১০ এবং পাইথন ৩.6.১ এ পরীক্ষিত)?

-5

parser.add_argumentএছাড়াও একটি সুইচ প্রয়োজন । আপনি ব্যবহার করতে পারেন required=False। পাইথন ২.7 সহ একটি নমুনা স্নিপেট এখানে রয়েছে:

parser = argparse.ArgumentParser(description='get dir')
parser.add_argument('--dir', type=str, help='dir', default=os.getcwd(), required=False)
args = parser.parse_args()

11
ওপি '--dir' নয়, পজিশনাল প্যারামগুলি সম্পর্কে জিজ্ঞাসা করছিলেন। 'প্রয়োজনীয়' পজিশনগুলির জন্য একটি অবৈধ যুক্তি। এবং 'মিথ্যা' টাইপো ছিল, তার অর্থ 'মিথ্যা'। নবাগতের জন্য +1, opালুতার জন্য -1।
সোলোপাইলট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.