argparse --- پارسر برای گزینهها، آرگومانها و زیرفرمانهای خط فرمان¶
اضافه شده در نسخهی 3.2.
کد منبع: Lib/argparse.py
توجه
در حالی که argparse بهطور پیشفرض بهعنوان ماژول کتابخانه استاندارد برای پیادهسازی برنامههای پایه خط فرمان توصیه میشود، نویسندگانی که الزامات دقیقتری درباره نحوه دقیق رفتار برنامههای خط فرمان خود دارند، ممکن است دریابند که این ماژول سطح کنترل لازم را فراهم نمیکند. برای جایگزینهای قابل بررسی در مواردی که argparse از رفتارهای مورد نیاز برنامه پشتیبانی نمیکند، به انتخاب یک کتابخانه تجزیه آرگومان مراجعه کنید (مانند غیرفعال کردن کامل پشتیبانی از درهمآمیختن گزینهها و آرگومانهای جایگاهی، یا پذیرفتن مقادیر پارامتر گزینهها که با - شروع میشوند، حتی زمانی که با گزینه تعریفشده دیگری مطابقت دارند).
ماژول argparse نوشتن رابطهای خط فرمان کاربرپسند را آسان میکند. برنامه آرگومانهایی را که نیاز دارد تعریف میکند، و argparse نحوهی تجزیهی آنها از sys.argv را تشخیص میدهد. ماژول argparse همچنین بهطور خودکار پیامهای راهنما و کاربرد را تولید میکند. این ماژول همچنین زمانی که کاربران آرگومانهای نامعتبر به برنامه بدهند، خطا نشان میدهد.
پشتیبانی ماژول argparse از رابطهای خط فرمان بر پایهی نمونهای از argparse.ArgumentParser ساخته شده است. این کلاس ظرفی برای مشخصات آرگومانها است و گزینههایی دارد که به پارسر بهعنوان یک کل اعمال میشوند:
parser = argparse.ArgumentParser(
prog='ProgramName',
description='What the program does',
epilog='Text at the bottom of help')
متد ArgumentParser.add_argument() مشخصات آرگومانها را بهصورت جداگانه به پارسر اضافه میکند. این متد از آرگومانهای جایگاهی، گزینههایی که مقدار میپذیرند و پرچمهای روشن/خاموش پشتیبانی میکند:
parser.add_argument('filename') # positional argument
parser.add_argument('-c', '--count') # option that takes a value
parser.add_argument('-v', '--verbose',
action='store_true') # on/off flag
متد ArgumentParser.parse_args() پارسر را اجرا میکند و دادههای استخراجشده را در یک شیء argparse.Namespace قرار میدهد:
args = parser.parse_args()
print(args.filename, args.count, args.verbose)
توجه
اگر به دنبال راهنمایی درباره چگونگی ارتقای کد optparse به argparse هستید، ارتقای کد Optparse را ببینید.
اشیای ArgumentParser¶
- class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True, exit_on_error=True, *, suggest_on_error=False, color=True)¶
یک شیء
ArgumentParserجدید ایجاد کنید. همه پارامترها باید بهصورت آرگومانهای کلیدواژهای ارسال شوند. هر پارامتر توضیح مفصلتری در زیر دارد، اما بهطور خلاصه آنها عبارتند از:prog - نام برنامه (پیشفرض: از ویژگیهای ماژول
__main__وsys.argv[0]تولید میشود)usage - رشتهای که کاربرد برنامه را توصیف میکند (پیشفرض: از آرگومانهای اضافهشده به پارسر تولید میشود)
description - متن برای نمایش پیش از راهنمای آرگومان (بهطور پیشفرض، بدون متن)
epilog - متنی که پس از راهنمای آرگومان نمایش داده میشود (بهطور پیشفرض، بدون متن)
parents - فهرستی از اشیای
ArgumentParserکه آرگومانهای آنها نیز باید گنجانده شوندformatter_class - کلاسی برای سفارشیسازی خروجی راهنما
prefix_chars - مجموعهای از نویسهها که پیشوند آرگومانهای اختیاری را تشکیل میدهند (پیشفرض: '-')
fromfile_prefix_chars - مجموعهای از نویسهها که پیشوند پروندههایی هستند که آرگومانهای اضافی باید از آنها خوانده شوند (پیشفرض:
None)argument_default - مقدار پیشفرض سراسری برای آرگومانها (پیشفرض:
None)conflict_handler - راهبرد رفع تعارض گزینههای اختیاری (معمولاً غیرضروری)
add_help - افزودن گزینه
-h/--helpبه پارسر (پیشفرض:True)allow_abbrev - اجازه میدهد گزینههای بلند مخفف شوند، مشروط بر اینکه مخفف بدون ابهام باشد (پیشفرض:
True)exit_on_error - تعیین میکند که آیا
ArgumentParserهنگام بروز خطا همراه با اطلاعات خطا خارج میشود یا خیر. (پیشفرض:True)suggest_on_error - پیشنهادها را برای گزینههای آرگومان و نامهای زیرپارسر (subparser) که اشتباه تایپشدهاند، فعال میکند (پیشفرض:
False)color - اجازه دادن به خروجی رنگی (پیشفرض:
True)
تغییر یافته در نسخهی 3.5: پارامتر allow_abbrev افزوده شد.
تغییر یافته در نسخهی 3.8: در نسخههای پیشین، allow_abbrev گروهبندی پرچمهای کوتاه مانند
-vvبه معنای-v -vرا نیز غیرفعال میکرد.تغییر یافته در نسخهی 3.9: پارامتر exit_on_error اضافه شد.
تغییر یافته در نسخهی 3.14: پارامترهای suggest_on_error و color افزوده شدند.
بخشهای زیر چگونگی استفاده از هر یک از این موارد را شرح میدهند.
prog¶
بهطور پیشفرض، ArgumentParser نام برنامه را برای نمایش در پیامهای راهنما، بسته به شیوهای که مفسر پایتون اجرا شده است، محاسبه میکند:
نام پایهبرایsys.argv[0]، اگر پروندهای بهعنوان آرگومان داده شده باشد.نام مفسر پایتون که پس از آن
sys.argv[0]میآید، در صورتی که یک پوشه یا یک پرونده زیپ بهعنوان آرگومان داده شده باشد.نام مفسر پایتون، بهدنبالِ
-mو سپس نام ماژول یا بسته، در صورتی که گزینهی-mاستفاده شده باشد.
این پیشفرض تقریباً همیشه مطلوب است، زیرا باعث میشود پیامهای راهنما با رشتهای که برنامه با آن در خط فرمان فراخوانی شده است مطابقت داشته باشند. با این حال، برای تغییر این رفتار پیشفرض، میتوان مقدار دیگری را با استفاده از آرگومان prog= برای ArgumentParser:: ارائه کرد:
>>> parser = argparse.ArgumentParser(prog='myprogram')
>>> parser.print_help()
usage: myprogram [-h]
options:
-h, --help show this help message and exit
توجه داشته باشید که نام برنامه، چه از sys.argv[0]، چه از ویژگیهای ماژول __main__ و چه از آرگومان prog= تعیین شده باشد، در پیامهای راهنما از طریق مشخصکنندهی قالب %(prog)s در دسترس است.
>>> parser = argparse.ArgumentParser(prog='myprogram')
>>> parser.add_argument('--foo', help='foo of the %(prog)s program')
>>> parser.print_help()
usage: myprogram [-h] [--foo FOO]
options:
-h, --help show this help message and exit
--foo FOO foo of the myprogram program
تغییر یافته در نسخهی 3.14: مقدار پیشفرض prog اکنون نشان میدهد که __main__ واقعاً چگونه اجرا شده است، بهجای آنکه همیشه os.path.basename(sys.argv[0]) باشد.
استفاده¶
بهطور پیشفرض، ArgumentParser پیام استفاده را بر اساس آرگومانهای خود محاسبه میکند. پیام پیشفرض را میتوان با آرگومان کلیدواژهای usage= بازنویسی کرد:
>>> parser = argparse.ArgumentParser(prog='PROG', usage='%(prog)s [options]')
>>> parser.add_argument('--foo', nargs='?', help='foo help')
>>> parser.add_argument('bar', nargs='+', help='bar help')
>>> parser.print_help()
usage: PROG [options]
positional arguments:
bar bar help
options:
-h, --help show this help message and exit
--foo [FOO] foo help
مشخصکننده قالب %(prog)s برای جایگذاری نام برنامه در پیامهای کاربرد شما در دسترس است.
هنگامی که پیام کاربرد سفارشی برای پارسر اصلی تعیین میشود، ممکن است بخواهید برای اطمینان از سازگاری پیشوندهای فرمان و اطلاعات کاربرد در میان پارسرهای فرعی، ارسال آرگومان prog به add_subparsers() یا آرگومانهای prog و usage به add_parser() را نیز در نظر بگیرید.
توضیحات¶
در بیشتر فراخوانیهای سازندهی ArgumentParser، از آرگومان کلیدواژهای description= استفاده میشود. این آرگومان شرح مختصری از آنچه برنامه انجام میدهد و چگونگی کار آن ارائه میدهد. در پیامهای راهنما، شرح بین رشتهی کاربرد خط فرمان و پیامهای راهنمای آرگومانهای مختلف نمایش داده میشود.
بهطور پیشفرض، سطرهای شرح شکسته میشوند تا در فضای دادهشده بگنجند. برای تغییر این رفتار، آرگومان formatter_class را ببینید.
epilog¶
برخی برنامهها تمایل دارند توضیحات تکمیلی برنامه را پس از توضیح آرگومانها نمایش دهند. چنین متنی را میتوان با استفاده از آرگومان epilog= برای ArgumentParser مشخص کرد:
>>> parser = argparse.ArgumentParser(
... description='A foo that bars',
... epilog="And that's how you'd foo a bar")
>>> parser.print_help()
usage: argparse.py [-h]
A foo that bars
options:
-h, --help show this help message and exit
And that's how you'd foo a bar
همانند آرگومان description، متن epilog= بهطور پیشفرض در عرض خط شکسته میشود، اما این رفتار را میتوان با آرگومان formatter_class برای ArgumentParser تنظیم کرد.
والدین¶
گاهی چند پارسر مجموعهای مشترک از آرگومانها دارند. بهجای تکرار تعاریف این آرگومانها، میتوان از یک پارسر واحد استفاده کرد که همهی آرگومانهای مشترک را دارد و بهعنوان مقدار آرگومان parents= به ArgumentParser ارسال میشود. آرگومان parents= فهرستی از اشیاء ArgumentParser را میپذیرد، همهی کنشهای جایگاهی و اختیاری (actions) را از آنها جمعآوری میکند و این کنشها را به شیء ArgumentParser که در حال ساخت است اضافه میکند:
>>> parent_parser = argparse.ArgumentParser(add_help=False)
>>> parent_parser.add_argument('--parent', type=int)
>>> foo_parser = argparse.ArgumentParser(parents=[parent_parser])
>>> foo_parser.add_argument('foo')
>>> foo_parser.parse_args(['--parent', '2', 'XXX'])
Namespace(foo='XXX', parent=2)
>>> bar_parser = argparse.ArgumentParser(parents=[parent_parser])
>>> bar_parser.add_argument('--bar')
>>> bar_parser.parse_args(['--bar', 'YYY'])
Namespace(bar='YYY', parent=None)
توجه داشته باشید که بیشتر پارسرهای والد add_help=False را تعیین میکنند. در غیر این صورت، ArgumentParser دو گزینه -h/--help (یکی در والد و دیگری در فرزند) را میبیند و خطایی پرتاب میکند.
توجه
شما باید پارسرها را پیش از انتقال آنها از طریق parents= بهطور کامل مقداردهی اولیه کنید. اگر پارسرهای والد را پس از پارسر فرزند تغییر دهید، آن تغییرات در فرزند بازتاب نخواهند یافت.
formatter_class¶
اشیای ArgumentParser امکان سفارشیسازی قالببندی راهنما را با مشخص کردن یک کلاس قالببندی جایگزین فراهم میکنند. در حال حاضر، چهار کلاس از این دست وجود دارد:
- class argparse.RawDescriptionHelpFormatter¶
- class argparse.RawTextHelpFormatter¶
- class argparse.ArgumentDefaultsHelpFormatter¶
- class argparse.MetavarTypeHelpFormatter¶
RawDescriptionHelpFormatter و RawTextHelpFormatter کنترل بیشتری بر چگونگی نمایش توضیحات متنی فراهم میکنند. بهطور پیشفرض، اشیاء ArgumentParser متنهای description و epilog را در پیامهای راهنمای خط فرمان با شکستن سطرها قالببندی میکنند:
>>> parser = argparse.ArgumentParser(
... prog='PROG',
... description='''this description
... was indented weird
... but that is okay''',
... epilog='''
... likewise for this epilog whose whitespace will
... be cleaned up and whose words will be wrapped
... across a couple lines''')
>>> parser.print_help()
usage: PROG [-h]
this description was indented weird but that is okay
options:
-h, --help show this help message and exit
likewise for this epilog whose whitespace will be cleaned up and whose words
will be wrapped across a couple lines
ارسال RawDescriptionHelpFormatter بهعنوان formatter_class= نشان میدهد که description و epilog از قبل بهدرستی قالببندی شدهاند و نباید سطرهای آنها شکسته شوند:
>>> parser = argparse.ArgumentParser(
... prog='PROG',
... formatter_class=argparse.RawDescriptionHelpFormatter,
... description=textwrap.dedent('''\
... Please do not mess up this text!
... --------------------------------
... I have indented it
... exactly the way
... I want it
... '''))
>>> parser.print_help()
usage: PROG [-h]
Please do not mess up this text!
--------------------------------
I have indented it
exactly the way
I want it
options:
-h, --help show this help message and exit
RawTextHelpFormatter فضای سفید را برای همهی انواع متنهای راهنما، از جمله توضیحات آرگومانها حفظ میکند. با این حال، چندین خط جدید با یک خط جدید جایگزین میشوند. اگر میخواهید چندین خط خالی حفظ شوند، بین سطرهای جدید فاصله اضافه کنید.
ArgumentDefaultsHelpFormatter بهطور خودکار اطلاعات مربوط به مقادیر پیشفرض را به هر یک از پیامهای راهنمای آرگومان اضافه میکند:
>>> parser = argparse.ArgumentParser(
... prog='PROG',
... formatter_class=argparse.ArgumentDefaultsHelpFormatter)
>>> parser.add_argument('--foo', type=int, default=42, help='FOO!')
>>> parser.add_argument('bar', nargs='*', default=[1, 2, 3], help='BAR!')
>>> parser.print_help()
usage: PROG [-h] [--foo FOO] [bar ...]
positional arguments:
bar BAR! (default: [1, 2, 3])
options:
-h, --help show this help message and exit
--foo FOO FOO! (default: 42)
MetavarTypeHelpFormatter از نام آرگومان type برای هر آرگومان بهعنوان نام نمایشی برای مقدارهای آن استفاده میکند (بهجای استفاده از dest آنگونه که قالببند معمولی انجام میدهد):
>>> parser = argparse.ArgumentParser(
... prog='PROG',
... formatter_class=argparse.MetavarTypeHelpFormatter)
>>> parser.add_argument('--foo', type=int)
>>> parser.add_argument('bar', type=float)
>>> parser.print_help()
usage: PROG [-h] [--foo int] float
positional arguments:
float
options:
-h, --help show this help message and exit
--foo int
prefix_chars¶
بیشتر گزینههای خط فرمان از - بهعنوان پیشوند استفاده میکنند، برای مثال -f/--foo. پارسرهایی که نیاز به پشتیبانی از نویسههای پیشوند متفاوت یا اضافی دارند، برای مثال برای گزینههایی مانند +f یا /foo، میتوانند آنها را با استفاده از آرگومان prefix_chars= در سازندهی ArgumentParser مشخص کنند:
>>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='-+')
>>> parser.add_argument('+f')
>>> parser.add_argument('++bar')
>>> parser.parse_args('+f X ++bar Y'.split())
Namespace(bar='Y', f='X')
مقدار پیشفرض آرگومان prefix_chars= برابر '-' است. ارائه مجموعهای از نویسهها که شامل - نباشد، باعث غیرمجاز شدن گزینههای -f/--foo میشود.
fromfile_prefix_chars¶
گاهی، هنگام کار با یک فهرست آرگومان بسیار طولانی، ممکن است منطقی باشد که فهرست آرگومانها را در یک پرونده نگه دارید، بهجای آنکه آن را در خط فرمان تایپ کنید. اگر آرگومان fromfile_prefix_chars= به سازندهی ArgumentParser داده شود، آرگومانهایی که با هر یک از نویسههای مشخصشده آغاز میشوند، بهعنوان پرونده در نظر گرفته میشوند و با آرگومانهایی که در بر دارند جایگزین میشوند. برای مثال:
>>> with open('args.txt', 'w', encoding=sys.getfilesystemencoding()) as fp:
... fp.write('-f\nbar')
...
>>> parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
>>> parser.add_argument('-f')
>>> parser.parse_args(['-f', 'foo', '@args.txt'])
Namespace(f='bar')
آرگومانهای خواندهشده از یک پرونده باید بهطور پیشفرض یکی در هر خط باشند (اما convert_arg_line_to_args() را نیز ببینید) و طوری با آنها رفتار میشود که گویی در همان جایگاه آرگومان اصلی ارجاعدهنده به پرونده در خط فرمان قرار دارند. بنابراین در مثال بالا، عبارت ['-f', 'foo', '@args.txt'] معادل عبارت ['-f', 'foo', '-f', 'bar'] در نظر گرفته میشود.
توجه
هر خط بهعنوان یک آرگومان واحد در نظر گرفته میشود، بنابراین یک خط خالی بهعنوان یک رشته خالی ('') خوانده میشود.
ArgumentParser از filesystem encoding and error handler برای خواندن پرونده حاوی آرگومانها استفاده میکند.
مقدار پیشفرض آرگومان fromfile_prefix_chars= برابر None است، به این معنا که آرگومانها هرگز بهعنوان ارجاع به پرونده در نظر گرفته نمیشوند.
تغییر یافته در نسخهی 3.12: ArgumentParser کدگذاری و خطاها را برای خواندن پروندههای آرگومان از پیشفرض (برای مثال locale.getpreferredencoding(False) و "strict") به کدگذاری و هندلر خطای سامانه فایلبندی تغییر داد. پرونده آرگومانها باید در ویندوز بهجای ANSI Codepage با UTF-8 کدگذاری شود.
argument_default¶
بهطور معمول، مقادیر پیشفرض آرگومانها یا با ارسال یک مقدار پیشفرض به add_argument() یا با فراخوانی متد set_defaults() با مجموعهای مشخص از جفتهای نام-مقدار مشخص میشوند. با این حال، گاهی ممکن است مشخص کردن یک پیشفرض واحد در سطح پارسر برای آرگومانها مفید باشد. این کار را میتوان با ارسال آرگومان کلیدواژهای argument_default= به ArgumentParser انجام داد. برای مثال، برای جلوگیری بهصورت سراسری از ایجاد ویژگی در فراخوانیهای parse_args()، argument_default=SUPPRESS را قرار میدهیم:
>>> parser = argparse.ArgumentParser(argument_default=argparse.SUPPRESS)
>>> parser.add_argument('--foo')
>>> parser.add_argument('bar', nargs='?')
>>> parser.parse_args(['--foo', '1', 'BAR'])
Namespace(bar='BAR', foo='1')
>>> parser.parse_args([])
Namespace()
allow_abbrev¶
بهطور معمول، هنگامی که یک فهرست آرگومان را به متد parse_args() از یک ArgumentParser ارسال میکنید، این متد برای گزینههای بلند مخففها را میشناسد.
این قابلیت را میتوان با تنظیم allow_abbrev روی False غیرفعال کرد:
>>> parser = argparse.ArgumentParser(prog='PROG', allow_abbrev=False)
>>> parser.add_argument('--foobar', action='store_true')
>>> parser.add_argument('--foonley', action='store_false')
>>> parser.parse_args(['--foon'])
usage: PROG [-h] [--foobar] [--foonley]
PROG: error: unrecognized arguments: --foon
اضافه شده در نسخهی 3.5.
conflict_handler¶
اشیاء ArgumentParser اجازه نمیدهند دو اکشن با رشتهی گزینه یکسان وجود داشته باشند. بهطور پیشفرض، اشیاء ArgumentParser در صورتی که تلاشی برای ایجاد آرگومانی با رشتهی گزینهای که از قبل در حال استفاده است انجام شود، استثنایی پرتاب میکنند:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-f', '--foo', help='old foo help')
>>> parser.add_argument('--foo', help='new foo help')
Traceback (most recent call last):
..
ArgumentError: argument --foo: conflicting option string(s): --foo
گاهی (مثلاً هنگام استفاده از parents) ممکن است مفید باشد که هر آرگومان قدیمیتری با همان رشتهی گزینه بهسادگی بازنویسی شود. برای دستیابی به این رفتار، میتوان مقدار 'resolve' را به آرگومان conflict_handler= در ArgumentParser داد:
>>> parser = argparse.ArgumentParser(prog='PROG', conflict_handler='resolve')
>>> parser.add_argument('-f', '--foo', help='old foo help')
>>> parser.add_argument('--foo', help='new foo help')
>>> parser.print_help()
usage: PROG [-h] [-f FOO] [--foo FOO]
options:
-h, --help show this help message and exit
-f FOO old foo help
--foo FOO new foo help
توجه داشته باشید که اشیاء ArgumentParser یک اکشنرا فقط در صورتی حذف میکنند که همه رشتههای گزینه (option strings) آن بازنویسیشده باشند. بنابراین، در مثال بالا، اکشن قدیمی -f/--foo بهعنوان اکشن -f حفظ میشود، زیرا فقط رشته گزینه --foo بازنویسیشده است.
add_help¶
بهطور پیشفرض، اشیای ArgumentParser گزینهای اضافه میکنند که صرفاً پیام راهنمای پارسر را نمایش میدهد. اگر -h یا --help در خط فرمان ارائه شود، راهنمای ArgumentParser چاپ خواهد شد.
گاهی اوقات، ممکن است غیرفعال کردن افزودن این گزینه راهنما مفید باشد. این کار را میتوان با ارسال False بهعنوان آرگومان add_help= به ArgumentParser انجام داد:
>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False)
>>> parser.add_argument('--foo', help='foo help')
>>> parser.print_help()
usage: PROG [--foo FOO]
options:
--foo FOO foo help
گزینه راهنما معمولاً -h/--help است. استثنای این حالت زمانی است که prefix_chars= مشخص شده باشد و شامل - نباشد، که در این صورت -h و --help گزینههای معتبری نیستند. در این حالت، از اولین نویسهی prefix_chars برای پیشوندگذاری گزینههای راهنما استفاده میشود:
>>> parser = argparse.ArgumentParser(prog='PROG', prefix_chars='+/')
>>> parser.print_help()
usage: PROG [+h]
options:
+h, ++help show this help message and exit
exit_on_error¶
بهطور معمول، هنگامی که یک فهرست آرگومانهای نامعتبر را به متد parse_args() از یک ArgumentParser ارسال میکنید، پیامی را در sys.stderr چاپ میکند و با کد وضعیت ۲ خارج میشود.
اگر کاربر بخواهد خطاها را بهصورت دستی بگیرد، میتوان این قابلیت را با تنظیم exit_on_error روی False فعال کرد:
>>> parser = argparse.ArgumentParser(exit_on_error=False)
>>> parser.add_argument('--integers', type=int)
_StoreAction(option_strings=['--integers'], dest='integers', nargs=None, const=None, default=None, type=<class 'int'>, choices=None, help=None, metavar=None)
>>> try:
... parser.parse_args('--integers a'.split())
... except argparse.ArgumentError:
... print('Catching an argumentError')
...
Catching an argumentError
اضافه شده در نسخهی 3.9.
suggest_on_error¶
بهطور پیشفرض، هنگامی که کاربر یک انتخاب نامعتبر برای آرگومان یا یک نام زیرپارسر (subparser) ارائه میدهد، ArgumentParser با اطلاعات خطا خارج میشود و انتخابهای مجاز آرگومان (در صورت مشخص بودن) یا نامهای زیرپارسر را بهعنوان بخشی از پیام خطا فهرست میکند.
اگر کاربر بخواهد پیشنهادها را برای انتخابهای آرگومان و نامهای زیرپارسر (subparser) که اشتباه تایپ شدهاند فعال کند، این قابلیت را میتوان با تنظیم suggest_on_error روی True فعال کرد. توجه داشته باشید که این فقط برای آرگومانهایی اعمال میشود که انتخابهای تعیینشده برای آنها رشته باشند:
>>> parser = argparse.ArgumentParser(suggest_on_error=True)
>>> parser.add_argument('--action', choices=['debug', 'dryrun'])
>>> parser.parse_args(['--action', 'debugg'])
usage: tester.py [-h] [--action {debug,dryrun}]
tester.py: error: argument --action: invalid choice: 'debugg', maybe you meant 'debug'? (choose from debug, dryrun)
اگر در حال نوشتن کدی هستید که باید با نسخههای قدیمیتر پایتون سازگار باشد و میخواهید در صورت در دسترس بودن، بهصورت فرصتطلبانه از suggest_on_error استفاده کنید، میتوانید بهجای استفاده از آرگومان کلیدواژهای، آن را پس از مقداردهی اولیهی پارسر بهعنوان یک ویژگی تنظیم کنید:
>>> parser = argparse.ArgumentParser(description='Process some integers.')
>>> parser.suggest_on_error = True
اضافه شده در نسخهی 3.14.
رنگ¶
بهطور پیشفرض، پیام راهنما با استفاده از ANSI escape sequences بهصورت رنگی چاپ میشود. اگر پیامهای راهنما را بهصورت متن ساده میخواهید، میتوانید آن را در محیط محلی خود یا در خود پارسر آرگومان با تنظیم color روی False غیرفعال کنید:
>>> parser = argparse.ArgumentParser(description='Process some integers.',
... color=False)
>>> parser.add_argument('--action', choices=['sum', 'max'])
>>> parser.add_argument('integers', metavar='N', type=int, nargs='+',
... help='an integer for the accumulator')
>>> parser.parse_args(['--help'])
توجه داشته باشید که هنگامی که color=True باشد، خروجی رنگی هم به متغیرهای محیطی و هم به قابلیتهای پایانه بستگی دارد. با این حال، اگر color=False باشد، خروجی رنگی همیشه غیرفعال است، حتی اگر متغیرهای محیطی مانند FORCE_COLOR تنظیم شده باشند.
توجه
در صورت هدایت stderr به یک پرونده، پیامهای خطا شامل کدهای رنگ خواهند بود. برای جلوگیری از این موضوع، متغیر محیطی NO_COLOR یا PYTHON_COLORS را تنظیم کنید (برای مثال، NO_COLOR=1 python script.py 2> errors.txt).
اضافه شده در نسخهی 3.14.
متد add_argument()¶
- ArgumentParser.add_argument(name or flags..., *[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest][, deprecated])¶
تعریف میکند که یک آرگومان خط فرمان باید چگونه تجزیه شود. هر پارامتر در زیر توضیح مفصلتری دارد، اما بهطور خلاصه عبارتاند از:
name or flags - یا یک نام یا فهرستی از رشتههای گزینه، برای مثال
'foo'یا'-f', '--foo'.action - نوع پایهی اکشنی که هنگام مواجهه با این آرگومان در خط فرمان انجام میشود.
nargs - تعداد آرگومانهای خط فرمان که باید مصرف شوند.
const - مقدار ثابتی که برخی انتخابهای action و nargs به آن نیاز دارند.
default - مقداری که اگر آرگومان در خط فرمان وجود نداشته باشد و در شیء فضای نام نیز غایب باشد، تولید میشود.
type - نوعی که آرگومان خط فرمان باید به آن تبدیل شود.
choices - دنبالهای از مقادیر مجاز برای آرگومان.
required - اینکه آیا میتوان گزینه خط فرمان را حذف کرد یا خیر (فقط گزینههای اختیاری).
help - شرحی مختصر از کاری که آرگومان انجام میدهد.
metavar - نامی برای آرگومان در پیامهای کاربرد.
dest - نام ویژگیای که به شیء برگرداندهشده توسط
parse_args()افزوده میشود.deprecated - اینکه استفاده از آرگومان منسوخ است یا خیر.
این متد یک شیء
Actionبرمیگرداند که نمایانگر آرگومان است.
بخشهای زیر چگونگی استفاده از هر یک از این موارد را شرح میدهند.
نام یا پرچمها¶
متد add_argument() باید بداند که آیا یک آرگومان اختیاری، مانند -f یا --foo، یا یک آرگومان جایگاهی، مانند فهرستی از نام پروندهها، انتظار میرود. بنابراین اولین آرگومانهای ارسالشده به add_argument() باید یا مجموعهای از پرچمها باشند یا یک نام آرگومان ساده.
برای مثال، میتوان یک آرگومان اختیاری به این صورت ایجاد کرد:
>>> parser.add_argument('-f', '--foo')
در حالی که یک آرگومان جایگاهی را میتوان به این شکل ایجاد کرد:
>>> parser.add_argument('bar')
هنگامی که parse_args() فراخوانی میشود، آرگومانهای اختیاری با پیشوند - شناسایی میشوند، و آرگومانهای باقیمانده جایگاهی فرض میشوند:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-f', '--foo')
>>> parser.add_argument('bar')
>>> parser.parse_args(['BAR'])
Namespace(bar='BAR', foo=None)
>>> parser.parse_args(['BAR', '--foo', 'FOO'])
Namespace(bar='BAR', foo='FOO')
>>> parser.parse_args(['--foo', 'FOO'])
usage: PROG [-h] [-f FOO] bar
PROG: error: the following arguments are required: bar
بهطور پیشفرض، argparse نامگذاری داخلی و نامهای نمایشی آرگومانها را بهطور خودکار مدیریت میکند و فرآیند را بدون نیاز به پیکربندی اضافی ساده میسازد. بنابراین، نیازی به مشخص کردن پارامترهای dest و metavar ندارید. برای آرگومانهای اختیاری، پارامتر dest بهطور پیشفرض برابر با نام آرگومان است، با جایگزینی زیرخط _ بهجای خطتیره -. پارامتر metavar بهطور پیشفرض برابر با نام با حروف بزرگ است. برای مثال:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo-bar')
>>> parser.parse_args(['--foo-bar', 'FOO-BAR'])
Namespace(foo_bar='FOO-BAR')
>>> parser.print_help()
usage: [-h] [--foo-bar FOO-BAR]
optional arguments:
-h, --help show this help message and exit
--foo-bar FOO-BAR
action¶
اشیای ArgumentParser آرگومانهای خط فرمان را به اکشنها مرتبط میکنند. این اکشنها میتوانند تقریباً هر کاری را با آرگومانهای خط فرمان مرتبط با خود انجام دهند، اگرچه بیشتر اکشنها صرفاً یک ویژگی به شیء برگرداندهشده از parse_args() اضافه میکنند. آرگومان کلیدواژهای action مشخص میکند که آرگومانهای خط فرمان باید چگونه مدیریت شوند. اکشنهای فراهمشده عبارتاند از:
'store'- این فقط مقدار آرگومان را ذخیره میکند. این اکشن پیشفرض است.'store_const'- این مقدار مشخصشده با آرگومان کلیدواژهای const را ذخیره میکند؛ توجه داشته باشید که مقدار پیشفرض آرگومان کلیدواژهای const برابرNoneاست. اکشن'store_const'بیشتر با آرگومانهای اختیاری استفاده میشود که نوعی پرچم را مشخص میکنند. برای مثال:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='store_const', const=42) >>> parser.parse_args(['--foo']) Namespace(foo=42)
'store_true'و'store_false'- اینها موارد خاصی از'store_const'هستند که بهترتیب مقادیرTrueوFalseرا با مقادیر پیشفرضFalseوTrueذخیره میکنند:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='store_true') >>> parser.add_argument('--bar', action='store_false') >>> parser.add_argument('--baz', action='store_false') >>> parser.parse_args('--foo --bar'.split()) Namespace(foo=True, bar=False, baz=True)
'append'- این عمل هر مقدار آرگومان را به یک فهرست اضافه میکند. این برای اجازه دادن به اینکه یک گزینه چندین بار مشخص شود، مفید است. اگر مقدار پیشفرض یک فهرست غیرخالی باشد، مقدار تجزیهشده با عناصر فهرست پیشفرض آغاز میشود و هر مقداری از خط فرمان پس از آن مقادیر پیشفرض اضافه میشود. نمونه استفاده:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='append', default=['0']) >>> parser.parse_args('--foo 1 --foo 2'.split()) Namespace(foo=['0', '1', '2'])
'append_const'- این کنش مقدار مشخصشده توسط آرگومان کلیدواژهای const را به یک فهرست الحاق میکند؛ توجه داشته باشید که مقدار پیشفرض آرگومان کلیدواژهای const برابرNoneاست. کنش'append_const'معمولاً زمانی مفید است که چند آرگومان نیاز دارند ثابتها را در یک فهرست مشترک ذخیره کنند. برای مثال:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--str', dest='types', action='append_const', const=str) >>> parser.add_argument('--int', dest='types', action='append_const', const=int) >>> parser.parse_args('--str --int'.split()) Namespace(types=[<class 'str'>, <class 'int'>])
'extend'- این هر یک از آیتمهای یک آرگومان چندمقداری را به یک فهرست اضافه میکند. اکشن'extend'معمولاً همراه با مقدار'+'یا'*'برای آرگومان کلیدواژهای nargs استفاده میشود. توجه داشته باشید که وقتی nargs برابر باNone(پیشفرض) یا'?'باشد، هر نویسهی رشتهی آرگومان به فهرست اضافه خواهد شد. نمونه کاربرد:>>> parser = argparse.ArgumentParser() >>> parser.add_argument("--foo", action="extend", nargs="+", type=str) >>> parser.parse_args(["--foo", "f1", "--foo", "f2", "f3", "f4"]) Namespace(foo=['f1', 'f2', 'f3', 'f4'])
اضافه شده در نسخهی 3.8.
'count'- این تعداد دفعاتی را که یک آرگومان رخ میدهد میشمارد. برای مثال، این برای افزایش سطوح پرگویی مفید است:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--verbose', '-v', action='count', default=0) >>> parser.parse_args(['-vvv']) Namespace(verbose=3)
Unless explicitly set, the default will be
None. If the default value is a non-zero number, the count starts from that number rather than from zero.'help'- این یک پیام راهنمای کامل برای همه گزینههای پارسر فعلی را چاپ میکند و سپس خارج میشود. بهطور پیشفرض، یک اکشن راهنما بهصورت خودکار به پارسر اضافه میشود. برای جزئیات چگونگی ایجاد خروجی،ArgumentParserرا ببینید.'version'- این گزینه به یک آرگومان کلیدواژهایversion=در فراخوانیadd_argument()نیاز دارد و هنگام فراخوانی، اطلاعات نسخه را چاپ کرده و خارج میشود:>>> import argparse >>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('--version', action='version', version='%(prog)s 2.0') >>> parser.parse_args(['--version']) PROG 2.0
همچنین میتوانید با ارسال یک زیرکلاس از Action (برای مثال BooleanOptionalAction) یا شیء دیگری که همان رابط را پیادهسازی میکند، یک اکشندلخواه را مشخص کنید. فقط کنشهایی که آرگومانهای خط فرمان را مصرف میکنند (برای مثال 'store'، 'append'، 'extend' یا کنشهای سفارشی با nargs غیرصفر) میتوانند با آرگومانهای جایگاهی استفاده شوند.
روش توصیهشده برای ایجاد یک کنش سفارشی، گسترش Action با بازنویسی متد __call__() و بهاختیار متدهای __init__() و format_usage() است. همچنین میتوانید کنشهای سفارشی را با استفاده از متد register() ثبت کنید و با نام ثبتشدهی آنها به آنها ارجاع دهید.
مثالی از یک اکشن سفارشی:
>>> class FooAction(argparse.Action):
... def __init__(self, option_strings, dest, nargs=None, **kwargs):
... if nargs is not None:
... raise ValueError("nargs not allowed")
... super().__init__(option_strings, dest, **kwargs)
... def __call__(self, parser, namespace, values, option_string=None):
... print('%r %r %r' % (namespace, values, option_string))
... setattr(namespace, self.dest, values)
...
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action=FooAction)
>>> parser.add_argument('bar', action=FooAction)
>>> args = parser.parse_args('1 --foo 2'.split())
Namespace(bar=None, foo=None) '1' None
Namespace(bar='1', foo=None) '2' '--foo'
>>> args
Namespace(bar='1', foo='2')
برای جزئیات بیشتر، Action را ببینید.
nargs¶
اشیای ArgumentParser معمولاً یک آرگومان خط فرمان را با یک اکشن مشخص مرتبط میکنند. آرگومان کلیدواژهای nargs تعداد متفاوتی از آرگومانهای خط فرمان را با یک اکشن مرتبط میکند. همچنین مشخص کردن آرگومانهای مبهم را ببینید. مقادیر پشتیبانیشده عبارتاند از:
N(یک عدد صحیح).Nآرگومان از خط فرمان در یک فهرست جمع میشوند. برای مثال:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', nargs=2) >>> parser.add_argument('bar', nargs=1) >>> parser.parse_args('c --foo a b'.split()) Namespace(bar=['c'], foo=['a', 'b'])
توجه کنید که
nargs=1یک فهرست با یک آیتم تولید میکند. این با حالت پیشفرض متفاوت است، که در آن آیتم بهتنهایی تولید میشود.
'?'. در صورت امکان، یک آرگومان از خط فرمان مصرف میشود و بهعنوان یک آیتم واحد تولید میشود. اگر هیچ آرگومان خط فرمانی وجود نداشته باشد، مقدار default تولید میشود. توجه داشته باشید که برای آرگومانهای اختیاری، حالت دیگری نیز وجود دارد: رشتهی گزینه موجود است اما آرگومان خط فرمانی پس از آن نمیآید. در این حالت، مقدار const تولید میشود. چند مثال برای روشنسازی این موضوع:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', nargs='?', const='c', default='d') >>> parser.add_argument('bar', nargs='?', default='d') >>> parser.parse_args(['XX', '--foo', 'YY']) Namespace(bar='XX', foo='YY') >>> parser.parse_args(['XX', '--foo']) Namespace(bar='XX', foo='c') >>> parser.parse_args([]) Namespace(bar='d', foo='d')
یکی از کاربردهای رایجتر
nargs='?'، مجاز کردن پروندههای ورودی و خروجی اختیاری است:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('infile', nargs='?') >>> parser.add_argument('outfile', nargs='?') >>> parser.parse_args(['input.txt', 'output.txt']) Namespace(infile='input.txt', outfile='output.txt') >>> parser.parse_args(['input.txt']) Namespace(infile='input.txt', outfile=None) >>> parser.parse_args([]) Namespace(infile=None, outfile=None)
'*'. تمام آرگومانهای خط فرمان موجود در یک فهرست جمعآوری میشوند. توجه داشته باشید که معمولاً داشتن بیش از یک آرگومان جایگاهی باnargs='*'معنای چندانی ندارد، اما داشتن چند آرگومان اختیاری باnargs='*'امکانپذیر است. برای مثال:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', nargs='*') >>> parser.add_argument('--bar', nargs='*') >>> parser.add_argument('baz', nargs='*') >>> parser.parse_args('a b --foo x y --bar 1 2'.split()) Namespace(bar=['1', '2'], baz=['a', 'b'], foo=['x', 'y'])
'+'. درست مانند'*'، تمام آرگومانهای خط فرمانِ موجود در یک فهرست گردآوری میشوند. بهعلاوه، اگر حداقل یک آرگومان خط فرمان وجود نداشته باشد، یک پیام خطا تولید میشود. برای مثال:>>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('foo', nargs='+') >>> parser.parse_args(['a', 'b']) Namespace(foo=['a', 'b']) >>> parser.parse_args([]) usage: PROG [-h] foo [foo ...] PROG: error: the following arguments are required: foo
اگر آرگومان کلیدواژهای nargs ارائه نشده باشد، تعداد آرگومانهای مصرفشده توسط action تعیین میشود. بهطور معمول، این بدان معناست که یک آرگومان خط فرمان مصرف میشود و یک آیتم (نه یک فهرست) تولید میشود. کنشهایی که آرگومانهای خط فرمان را مصرف نمیکنند (مانند 'store_const')، nargs=0 را تنظیم میکنند.
const¶
آرگومان const در add_argument() برای نگهداری مقادیر ثابتی استفاده میشود که از خط فرمان خوانده نمیشوند، اما برای کنشهای مختلف ArgumentParser مورد نیاز هستند. دو مورد از رایجترین کاربردهای آن عبارتاند از:
هنگامی که
add_argument()باaction='store_const'یاaction='append_const'فراخوانی میشود. این اکشنها مقدارconstرا به یکی از ویژگیهای شیء برگرداندهشده توسطparse_args()اضافه میکنند. برای مثالها، شرح action را ببینید. اگرconstبهadd_argument()ارائه نشود، مقدار پیشفرضNoneرا دریافت خواهد کرد.هنگامی که
add_argument()با رشتههای گزینه (مانند-fیا--foo) وnargs='?'فراخوانی میشود، این کار یک آرگومان اختیاری ایجاد میکند که میتواند صفر یا یک آرگومان خط فرمان پس از خود داشته باشد. هنگام تجزیه خط فرمان، اگر رشته گزینه بدون هیچ آرگومان خط فرمانی پس از آن مشاهده شود، مقدارconstاستفاده خواهد شد. برای نمونهها، توضیحات nargs را ببینید.
تغییر یافته در نسخهی 3.11: const=None بهطور پیشفرض، از جمله زمانی که action='append_const' یا action='store_const' باشد.
پیشفرض¶
میتوان تمام آرگومانهای اختیاری و برخی آرگومانهای جایگاهی را در خط فرمان حذف کرد. آرگومان کلیدواژهای default در add_argument()، که مقدار پیشفرض آن None است، مشخص میکند که اگر آرگومان خط فرمان وجود نداشته باشد، از چه مقداری باید استفاده شود. برای آرگومانهای اختیاری، هرگاه رشتهی گزینه در خط فرمان وجود نداشته باشد، از مقدار default استفاده میشود:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default=42)
>>> parser.parse_args(['--foo', '2'])
Namespace(foo='2')
>>> parser.parse_args([])
Namespace(foo=42)
اگر فضای نام هدف از قبل ویژگی تنظیمشدهای داشته باشد، پیشفرضِ اکشن آن را بازنویسی نمیکند:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default=42)
>>> parser.parse_args([], namespace=argparse.Namespace(foo=101))
Namespace(foo=101)
اگر مقدار default یک رشته باشد، پارسر مقدار را طوری تجزیه میکند که گویی یک آرگومان خط فرمان باشد. بهطور خاص، پارسر هر آرگومان تبدیل type را، در صورت ارائه، پیش از تنظیم ویژگی روی مقدار بازگشتی Namespace اعمال میکند. در غیر این صورت، پارسر از مقدار همانطور که هست استفاده میکند:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--length', default='10', type=int)
>>> parser.add_argument('--width', default=10.5, type=int)
>>> parser.parse_args()
Namespace(length=10, width=10.5)
برای آرگومانهای جایگاهی که nargs آنها برابر با ? یا * است، هرگاه هیچ آرگومانی در خط فرمان وجود نداشته باشد، از مقدار default استفاده میشود:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('foo', nargs='?', default=42)
>>> parser.parse_args(['a'])
Namespace(foo='a')
>>> parser.parse_args([])
Namespace(foo=42)
از آنجا که nargs='*' همه مقادیر ارائهشده را در یک فهرست جمع میکند، در نبود یک آرگومان جایگاهی، یک فهرست خالی ([]) برگردانده میشود. تنها یک پیشفرض غیر None این رفتار را بازنویسی میکند (بنابراین default=None همچنان [] برمیگرداند).
برای آرگومانهای required، مقدار default نادیده گرفته میشود. برای مثال، این موضوع به آرگومانهای جایگاهی با مقادیر nargs غیر از ? یا *، یا آرگومانهای اختیاری که با required=True علامتگذاری شدهاند اعمال میشود.
با ارائه default=argparse.SUPPRESS، اگر آرگومان خط فرمان وجود نداشته باشد، هیچ ویژگیای اضافه نمیشود:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default=argparse.SUPPRESS)
>>> parser.parse_args([])
Namespace()
>>> parser.parse_args(['--foo', '1'])
Namespace(foo='1')
نوع¶
بهطور پیشفرض، پارسر آرگومانهای خط فرمان را بهصورت رشتههای ساده میخواند. با این حال، اغلب رشتهی خط فرمان باید بهجای آن بهعنوان نوع دیگری تفسیر شود، مانند float یا int. کلیدواژهی type برای add_argument() امکان انجام هرگونه بررسی نوع و تبدیل نوع ضروری را فراهم میکند.
اگر از کلیدواژهی type همراه با کلیدواژهی default استفاده شود، مبدل نوع فقط زمانی اعمال میشود که مقدار پیشفرض یک رشته باشد.
آرگومان type میتواند یک شیء فراخوانیپذیر باشد که یک رشته واحد را میپذیرد، یا نام یک نوع ثبتشده (به register() مراجعه کنید). اگر تابع ArgumentTypeError، TypeError یا ValueError را پرتاب کند، استثنا گرفته میشود و یک پیام خطای بهخوبی قالببندیشده نمایش داده میشود. سایر انواع استثنا مدیریت نمیشوند.
میتوان از انواع و توابع توکار رایج بهعنوان مبدلهای نوع استفاده کرد:
import argparse
import pathlib
parser = argparse.ArgumentParser()
parser.add_argument('count', type=int)
parser.add_argument('distance', type=float)
parser.add_argument('street', type=ascii)
parser.add_argument('code_point', type=ord)
parser.add_argument('datapath', type=pathlib.Path)
میتوان از توابع تعریفشده توسط کاربر نیز استفاده کرد:
>>> def hyphenated(string):
... return '-'.join([word[:4] for word in string.casefold().split()])
...
>>> parser = argparse.ArgumentParser()
>>> _ = parser.add_argument('short_title', type=hyphenated)
>>> parser.parse_args(['"The Tale of Two Cities"'])
Namespace(short_title='"the-tale-of-two-citi')
تابع bool() بهعنوان مبدل نوع توصیه نمیشود. تنها کاری که انجام میدهد تبدیل رشتههای خالی به False و رشتههای غیرخالی به True است. این معمولاً آنچه مطلوب است نیست:
>>> parser = argparse.ArgumentParser()
>>> _ = parser.add_argument('--verbose', type=bool)
>>> parser.parse_args(['--verbose', 'False'])
Namespace(verbose=True)
برای جایگزینهای رایج، BooleanOptionalAction یا action='store_true' را ببینید.
بهطور کلی، آرگومان کلیدواژهای type برای سهولت در نظر گرفته شده است و باید فقط برای تبدیلهای سادهای به کار رود که تنها میتوانند یکی از سه استثنای پشتیبانیشده را پرتاب کنند. هر موردی که مدیریت خطا یا مدیریت منابع پیچیدهتری دارد، باید پس از تجزیهی آرگومانها در مراحل بعدی انجام شود.
برای مثال، تبدیلهای JSON یا YAML دارای موارد خطای پیچیدهای هستند که به گزارشدهی بهتری نسبت به آنچه کلیدواژه type میتواند ارائه کند نیاز دارند. یک JSONDecodeError بهدرستی قالببندی نمیشد و استثنای FileNotFoundError بههیچوجه مدیریت نمیشد.
حتی FileType برای استفاده با کلیدواژهی type محدودیتهایی دارد. اگر یک آرگومان از FileType استفاده کند و سپس آرگومان بعدی با شکست مواجه شود، خطایی گزارش میشود اما پرونده بهطور خودکار بسته نمیشود. در این صورت، بهتر است تا پایان اجرای پارسر صبر کنید و سپس از دستور with برای مدیریت پروندهها استفاده کنید.
برای ابزارهای بررسی نوع که صرفاً در برابر مجموعه ثابتی از مقادیر بررسی میکنند، استفاده از کلیدواژه choices را بهجای آن در نظر بگیرید.
گزینهها¶
برخی آرگومانهای خط فرمان باید از میان یک مجموعه محدود از مقدارها انتخاب شوند. این موارد را میتوان با ارسال یک شیء دنباله بهعنوان آرگومان کلیدواژهای choices به add_argument() مدیریت کرد. هنگامی که خط فرمان تجزیه میشود، مقدارهای آرگومان بررسی خواهند شد و اگر آرگومان یکی از مقدارهای قابلقبول نباشد، یک پیام خطا نمایش داده میشود:
>>> parser = argparse.ArgumentParser(prog='game.py')
>>> parser.add_argument('move', choices=['rock', 'paper', 'scissors'])
>>> parser.parse_args(['rock'])
Namespace(move='rock')
>>> parser.parse_args(['fire'])
usage: game.py [-h] {rock,paper,scissors}
game.py: error: argument move: invalid choice: 'fire' (choose from 'rock',
'paper', 'scissors')
هر دنبالهای را میتوان بهعنوان مقدار choices ارسال کرد، بنابراین اشیای list، اشیای tuple و دنبالههای سفارشی همگی پشتیبانی میشوند.
استفاده از enum.Enum توصیه نمیشود، زیرا کنترل نحوهی نمایش آن در کاربرد، راهنما و پیامهای خطا دشوار است.
توجه داشته باشید که choices پس از انجام هرگونه تبدیل type بررسی میشوند، بنابراین اشیاء موجود در choices باید با type مشخصشده مطابقت داشته باشند. این موضوع میتواند باعث شود choices در نحوه استفاده، راهنما یا پیامهای خطا ناآشنا به نظر برسد.
برای کاربرپسند نگهداشتن choices، پوششی سفارشی برای نوع در نظر بگیرید که مقادیر را تبدیل و قالببندی میکند، یا type را حذف کنید و تبدیل را در کد برنامهتان مدیریت کنید.
گزینههای قالببندیشده بهجای metavar پیشفرض، که معمولاً از dest مشتق میشود، استفاده میشوند. این معمولاً همان چیزی است که شما میخواهید، زیرا کاربر هرگز پارامتر dest را نمیبیند. اگر این نمایش مطلوب نیست (شاید به این دلیل که گزینههای زیادی وجود دارد)، کافی است یک metavar صریح مشخص کنید.
الزامی¶
بهطور کلی، ماژول argparse فرض میکند که پرچمهایی مانند -f و --bar نشاندهندهی آرگومانهای اختیاری هستند که همیشه میتوان در خط فرمان از آنها صرفنظر کرد. برای الزامی کردن یک گزینه، میتوان True را برای آرگومان کلیدواژهای required= در add_argument() مشخص کرد:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', required=True)
>>> parser.parse_args(['--foo', 'BAR'])
Namespace(foo='BAR')
>>> parser.parse_args([])
usage: [-h] --foo FOO
: error: the following arguments are required: --foo
همانطور که مثال نشان میدهد، اگر یک گزینه بهعنوان required علامتگذاری شده باشد، parse_args() در صورتی که آن گزینه در خط فرمان وجود نداشته باشد، خطایی گزارش خواهد کرد.
توجه
گزینههای الزامی عموماً نامناسب تلقی میشوند، زیرا کاربران انتظار دارند گزینهها اختیاری باشند؛ بنابراین باید در صورت امکان از آنها اجتناب شود.
راهنما¶
مقدار help یک رشته است که شامل توضیحی مختصر در مورد آرگومان میشود. هنگامی که کاربر درخواست راهنما میکند (معمولاً با استفاده از -h یا --help در خط فرمان)، این توضیحات help همراه با هر آرگومان نمایش داده خواهند شد.
رشتههای help میتوانند شامل مشخصکنندههای قالب مختلفی باشند تا از تکرار مواردی مانند نام برنامه یا default آرگومان جلوگیری شود. مشخصکنندههای موجود شامل نام برنامه، %(prog)s و بیشتر آرگومانهای کلیدواژهای add_argument() هستند، برای مثال %(default)s، %(type)s و غیره.:
>>> parser = argparse.ArgumentParser(prog='frobble')
>>> parser.add_argument('bar', nargs='?', type=int, default=42,
... help='the bar to %(prog)s (default: %(default)s)')
>>> parser.print_help()
usage: frobble [-h] [bar]
positional arguments:
bar the bar to frobble (default: 42)
options:
-h, --help show this help message and exit
از آنجا که رشته راهنما از قالببندی % پشتیبانی میکند، اگر میخواهید یک % بهصورت لفظی در رشته راهنما ظاهر شود، باید آن را بهصورت %% خنثی کنید.
argparse از پنهان کردن ورودی راهنما برای برخی گزینهها، با تنظیم مقدار help بر روی argparse.SUPPRESS پشتیبانی میکند:
>>> parser = argparse.ArgumentParser(prog='frobble')
>>> parser.add_argument('--foo', help=argparse.SUPPRESS)
>>> parser.print_help()
usage: frobble [-h]
options:
-h, --help show this help message and exit
metavar¶
هنگامی که ArgumentParser پیامهای راهنما را تولید میکند، به روشی برای ارجاع به هر آرگومان مورد انتظار نیاز دارد. بهطور پیشفرض، اشیاء ArgumentParser از مقدار dest بهعنوان «نام» هر شیء استفاده میکنند. بهطور پیشفرض، برای کنشهای آرگومانهای جایگاهی، مقدار dest مستقیماً استفاده میشود، و برای کنشهای آرگومانهای اختیاری، مقدار dest به حروف بزرگ تبدیل میشود. بنابراین، یک آرگومان جایگاهی با dest='bar'، bar نامیده میشود. یک آرگومان اختیاری --foo که باید یک آرگومان خط فرمان به دنبال آن بیاید، FOO نامیده میشود. یک مثال:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> parser.add_argument('bar')
>>> parser.parse_args('X --foo Y'.split())
Namespace(bar='X', foo='Y')
>>> parser.print_help()
usage: [-h] [--foo FOO] bar
positional arguments:
bar
options:
-h, --help show this help message and exit
--foo FOO
میتوان یک نام جایگزین را با metavar مشخص کرد:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', metavar='YYY')
>>> parser.add_argument('bar', metavar='XXX')
>>> parser.parse_args('X --foo Y'.split())
Namespace(bar='X', foo='Y')
>>> parser.print_help()
usage: [-h] [--foo YYY] XXX
positional arguments:
XXX
options:
-h, --help show this help message and exit
--foo YYY
توجه داشته باشید که metavar فقط نام نمایشدادهشده را تغییر میدهد — نام ویژگی در شیء parse_args() همچنان توسط مقدار dest تعیین میشود.
مقادیر مختلف nargs ممکن است باعث شود metavar چندین بار استفاده شود. ارائه یک تاپل به metavar نمایش متفاوتی را برای هر یک از آرگومانها مشخص میکند:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x', nargs=2)
>>> parser.add_argument('--foo', nargs=2, metavar=('bar', 'baz'))
>>> parser.print_help()
usage: PROG [-h] [-x X X] [--foo bar baz]
options:
-h, --help show this help message and exit
-x X X
--foo bar baz
dest¶
بیشتر کنشهای ArgumentParser مقداری را بهعنوان ویژگیای از شیء برگرداندهشده از parse_args() میافزایند. نام این ویژگی با آرگومان کلیدواژهای dest در add_argument() تعیین میشود. برای کنشهای آرگومانهای جایگاهی، dest معمولاً بهعنوان اولین آرگومان به add_argument() داده میشود:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('bar')
>>> parser.parse_args(['XXX'])
Namespace(bar='XXX')
برای کنشهای آرگومانهای اختیاری، مقدار dest معمولاً از رشتههای گزینه استنباط میشود. ArgumentParser مقدار dest را با گرفتن نخستین رشتهی گزینهی بلند و حذف رشتهی -- ابتدایی تولید میکند. اگر هیچ رشتهی گزینهی بلندی ارائه نشده باشد، dest با حذف نویسهی - ابتدایی از نخستین رشتهی گزینهی کوتاه بهدست میآید. هر نویسهی - داخلی به نویسهی _ تبدیل میشود تا اطمینان حاصل شود که رشته یک نام ویژگی معتبر است. مثالهای زیر این رفتار را نشان میدهند:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-f', '--foo-bar', '--foo')
>>> parser.add_argument('-x', '-y')
>>> parser.parse_args('-f 1 -x 2'.split())
Namespace(foo_bar='1', x='2')
>>> parser.parse_args('--foo 1 -y 2'.split())
Namespace(foo_bar='1', x='2')
dest امکان ارائهی یک نام ویژگی سفارشی را فراهم میکند:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', dest='bar')
>>> parser.parse_args('--foo XXX'.split())
Namespace(bar='XXX')
آرگومانهای متعدد میتوانند dest یکسانی داشته باشند. بهصورت پیشفرض، مقدار آخرین آرگومان از این نوع که در خط فرمان وارد شود، برنده میشود. در عوض، برای جمعآوری مقادیر همهی آنها در یک فهرست، از action='append' استفاده کنید. برای رشتههای گزینه دارای تعارض، نه نامهای dest، conflict_handler را ببینید.
منسوخ¶
در طول عمر یک پروژه، ممکن است نیاز باشد برخی آرگومانها از خط فرمان حذف شوند. پیش از حذف آنها، باید به کاربران خود اطلاع دهید که آرگومانها منسوخ شدهاند و حذف خواهند شد. آرگومان کلیدواژهای deprecated در add_argument()، که مقدار پیشفرض آن False است، مشخص میکند که آیا آرگومان منسوخ است و در آینده حذف خواهد شد یا خیر. برای آرگومانها، اگر deprecated برابر True باشد، هنگام استفاده از آرگومان، هشداری در sys.stderr چاپ میشود:
>>> import argparse
>>> parser = argparse.ArgumentParser(prog='snake.py')
>>> parser.add_argument('--legs', default=0, type=int, deprecated=True)
>>> parser.parse_args([])
Namespace(legs=0)
>>> parser.parse_args(['--legs', '4'])
snake.py: warning: option '--legs' is deprecated
Namespace(legs=4)
اضافه شده در نسخهی 3.13.
کلاسهای اکشن¶
کلاسهای Action، Action API را پیادهسازی میکنند؛ یک فراخوانیپذیر که یک فراخوانیپذیر برای پردازش آرگومانهای خط فرمان بازمیگرداند. هر شیءای که از این API پیروی کند، میتواند بهعنوان پارامتر action به add_argument() ارسال شود.
- class argparse.Action(option_strings, dest, nargs=None, const=None, default=None, type=None, choices=None, required=False, help=None, metavar=None)¶
اشیای
Actionتوسط یکArgumentParserبرای نشان دادن اطلاعات مورد نیاز برای تجزیهی یک آرگومان از یک یا چند رشته از خط فرمان به کار میروند. کلاسActionباید دو آرگومان جایگاهی بههمراه هر آرگومان کلیدواژهای که بهArgumentParser.add_argument()ارسال میشود، بهجز خودaction، بپذیرد.در نمونههای
Action(یا مقدار بازگشتی هر فراخوانیپذیر که به پارامترactionداده شود) باید ویژگیهایdest،option_strings،default،type،required،helpو غیره تعریفشده باشند. سادهترین راه برای اطمینان از تعریف این ویژگیها، فراخوانیAction.__init__()است.- __call__(parser, namespace, values, option_string=None)¶
نمونههای
Actionباید فراخوانیپذیر باشند، بنابراین زیرکلاسها باید متد__call__()را بازنویسی کنند، که باید چهار پارامتر بپذیرد:parser - شیء
ArgumentParserکه شامل این اکشناست.namespace - شیء
Namespaceکه توسطparse_args()بازگردانده میشود. بیشتر اکشنها با استفاده ازsetattr()یک ویژگی به این شیء اضافه میکنند.values - آرگومانهای مرتبط با خط فرمان، با هرگونه تبدیل نوع اعمالشده. تبدیلهای نوع با آرگومان کلیدواژهای type در
add_argument()مشخص میشوند.option_string - رشتهی گزینهای که برای فراخوانی این عمل استفاده شده است. آرگومان
option_stringاختیاری است و اگر اکشن با یک آرگومان جایگاهی مرتبط باشد، وجود نخواهد داشت.
متد
__call__()ممکن است عملیات دلخواهی انجام دهد، اما معمولاً ویژگیهایی را رویnamespaceبر اساسdestوvaluesتنظیم میکند.
- format_usage()¶
زیرکلاسهای
Actionمیتوانند یک متدformat_usage()تعریف کنند که هیچ آرگومانی نمیگیرد و رشتهای را برمیگرداند که هنگام چاپ کاربرد برنامه استفاده خواهد شد. اگر چنین متدی ارائه نشود، از یک پیشفرض مناسب استفاده خواهد شد.
- class argparse.BooleanOptionalAction¶
زیرکلاسی از
Actionبرای مدیریت پرچمهای بولی با گزینههای مثبت و منفی. افزودن یک آرگومان مانند--fooبهطور خودکار هر دو گزینهی--fooو--no-fooرا ایجاد میکند که بهترتیبTrueوFalseرا ذخیره میکنند:>>> import argparse >>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action=argparse.BooleanOptionalAction) >>> parser.parse_args(['--no-foo']) Namespace(foo=False)
اضافه شده در نسخهی 3.9.
متد parse_args()¶
- ArgumentParser.parse_args(args=None, namespace=None)¶
رشتههای آرگومان را به شیء تبدیل کنید و آنها را بهعنوان ویژگیهای فضای نام اختصاص دهید. فضای نام پرشده را برگردانید.
فراخوانیهای قبلی به
add_argument()دقیقاً تعیین میکنند که چه اشیایی ایجاد میشوند و چگونه اختصاص داده میشوند. برای جزئیات، مستنداتadd_argument()را ببینید.
سینتکس مقدار گزینه¶
متد parse_args() از چندین روش برای تعیین مقدار یک گزینه (در صورتی که مقداری بپذیرد) پشتیبانی میکند. در سادهترین حالت، گزینه و مقدار آن بهعنوان دو آرگومان جداگانه ارسال میشوند:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x')
>>> parser.add_argument('--foo')
>>> parser.parse_args(['-x', 'X'])
Namespace(foo=None, x='X')
>>> parser.parse_args(['--foo', 'FOO'])
Namespace(foo='FOO', x=None)
برای گزینههای بلند (گزینههایی با نامهایی طولانیتر از یک نویسه)، میتوان گزینه و مقدار را بهعنوان یک آرگومان خط فرمان واحد نیز ارسال کرد و برای جداسازی آنها از = استفاده کرد:
>>> parser.parse_args(['--foo=FOO'])
Namespace(foo='FOO', x=None)
برای گزینههای کوتاه (گزینههایی که فقط یک نویسه طول دارند)، میتوان گزینه و مقدار آن را بههم چسباند:
>>> parser.parse_args(['-xX'])
Namespace(foo=None, x='X')
میتوان چند گزینه کوتاه را با استفاده از تنها یک پیشوند - با هم ترکیب کرد، مشروط بر اینکه فقط آخرین گزینه (یا هیچکدام از آنها) نیازمند مقدار باشد:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x', action='store_true')
>>> parser.add_argument('-y', action='store_true')
>>> parser.add_argument('-z')
>>> parser.parse_args(['-xyzZ'])
Namespace(x=True, y=True, z='Z')
آرگومانهای نامعتبر¶
هنگام تجزیه خط فرمان، parse_args() خطاهای مختلفی را بررسی میکند، از جمله گزینههای مبهم، انواع نامعتبر، گزینههای نامعتبر، تعداد نادرست آرگومانهای جایگاهی و غیره. هنگامی که با چنین خطایی مواجه میشود، خارج میشود و خطا را به همراه پیام کاربرد چاپ میکند:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo', type=int)
>>> parser.add_argument('bar', nargs='?')
>>> # invalid type
>>> parser.parse_args(['--foo', 'spam'])
usage: PROG [-h] [--foo FOO] [bar]
PROG: error: argument --foo: invalid int value: 'spam'
>>> # invalid option
>>> parser.parse_args(['--bar'])
usage: PROG [-h] [--foo FOO] [bar]
PROG: error: unrecognized arguments: --bar
>>> # wrong number of arguments
>>> parser.parse_args(['spam', 'badger'])
usage: PROG [-h] [--foo FOO] [bar]
PROG: error: unrecognized arguments: badger
آرگومانهای شامل -¶
متد parse_args() تلاش میکند هرگاه کاربر بهوضوح اشتباهی مرتکب شده باشد، خطا گزارش کند، اما برخی موقعیتها ذاتاً مبهم هستند. برای مثال، آرگومان خط فرمان -1 میتواند تلاشی برای مشخص کردن یک گزینه یا تلاشی برای ارائه یک آرگومان جایگاهی باشد. متد parse_args() در اینجا محتاط است: آرگومانهای جایگاهی تنها در صورتی میتوانند با - شروع شوند که شبیه اعداد منفی باشند و هیچ گزینهای در پارسر وجود نداشته باشد که شبیه اعداد منفی باشد:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-x')
>>> parser.add_argument('foo', nargs='?')
>>> # no negative number options, so -1 is a positional argument
>>> parser.parse_args(['-x', '-1'])
Namespace(foo=None, x='-1')
>>> # no negative number options, so -1 and -5 are positional arguments
>>> parser.parse_args(['-x', '-1', '-5'])
Namespace(foo='-5', x='-1')
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-1', dest='one')
>>> parser.add_argument('foo', nargs='?')
>>> # negative number options present, so -1 is an option
>>> parser.parse_args(['-1', 'X'])
Namespace(foo=None, one='X')
>>> # negative number options present, so -2 is an option
>>> parser.parse_args(['-2'])
usage: PROG [-h] [-1 ONE] [foo]
PROG: error: unrecognized arguments: -2
>>> # negative number options present, so both -1s are options
>>> parser.parse_args(['-1', '-1'])
usage: PROG [-h] [-1 ONE] [foo]
PROG: error: argument -1: expected one argument
اگر آرگومانهای جایگاهی دارید که باید با - شروع شوند و شبیه اعداد منفی نیستند، میتوانید شبهآرگومان '--' را درج کنید که به parse_args() میگوید هرچه پس از آن میآید آرگومان جایگاهی است:
>>> parser.parse_args(['--', '-f'])
Namespace(foo='-f', one=None)
برای جزئیات بیشتر، راهنمای argparse درباره آرگومانهای مبهم را نیز ببینید.
تغییر یافته در نسخهی 3.14: Negative-number matching was expanded to include numbers in scientific
notation (-2.5e-6), numbers containing underscores (-1_234.5),
and complex numbers (-1.2e-3j).
مخففهای آرگومان (تطبیق پیشوند)¶
متد parse_args() بهطور پیشفرض اجازه میدهد گزینههای بلند به یک پیشوند اختصار یابند، اگر اختصار مبهم نباشد (پیشوند با یک گزینهی یکتا مطابقت داشته باشد):
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-bacon')
>>> parser.add_argument('-badger')
>>> parser.parse_args('-bac MMM'.split())
Namespace(bacon='MMM', badger=None)
>>> parser.parse_args('-bad WOOD'.split())
Namespace(bacon=None, badger='WOOD')
>>> parser.parse_args('-ba BA'.split())
usage: PROG [-h] [-bacon BACON] [-badger BADGER]
PROG: error: ambiguous option: -ba could match -badger, -bacon
برای آرگومانهایی که ممکن است بیش از یک گزینه تولید کنند، خطایی تولید میشود. این قابلیت را میتوان با تنظیم allow_abbrev روی False غیرفعال کرد.
فراتر از sys.argv¶
گاهی ممکن است مفید باشد که یک ArgumentParser آرگومانهایی غیر از آرگومانهای sys.argv را تجزیه کند. این کار را میتوان با گذراندن فهرستی از رشتهها به parse_args() انجام داد. این برای آزمون در خط فرمان تعاملی مفید است:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument(
... 'integers', metavar='int', type=int, choices=range(10),
... nargs='+', help='an integer in the range 0..9')
>>> parser.add_argument(
... '--sum', dest='accumulate', action='store_const', const=sum,
... default=max, help='sum the integers (default: find the max)')
>>> parser.parse_args(['1', '2', '3', '4'])
Namespace(accumulate=<built-in function max>, integers=[1, 2, 3, 4])
>>> parser.parse_args(['1', '2', '3', '4', '--sum'])
Namespace(accumulate=<built-in function sum>, integers=[1, 2, 3, 4])
شیء فضای نام¶
- class argparse.Namespace¶
کلاس سادهای که بهطور پیشفرض توسط
parse_args()برای ایجاد یک شیء حاوی ویژگیها و بازگرداندن آن استفاده میشود.این کلاس عمداً ساده است؛ فقط یک زیرکلاس از
objectبا بازنمایی رشتهای خوانا است. اگر ترجیح میدهید نمایی دیکشنریمانند از ویژگیها داشته باشید، میتوانید از الگوی استاندارد پایتون استفاده کنید:vars():>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo') >>> args = parser.parse_args(['--foo', 'BAR']) >>> vars(args) {'foo': 'BAR'}
همچنین ممکن است مفید باشد که یک
ArgumentParserویژگیهایی را به یک شیء از پیش موجود اختصاص دهد، نه به یک شیءNamespaceجدید. این کار را میتوان با تعیین آرگومان کلیدواژهایnamespace=انجام داد:>>> class C: ... pass ... >>> c = C() >>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo') >>> parser.parse_args(args=['--foo', 'BAR'], namespace=c) >>> c.foo 'BAR'
سایر ابزارها¶
زیرفرمانها¶
- ArgumentParser.add_subparsers(*[, title][, description][, prog][, parser_class][, action][, dest][, required][, help][, metavar])¶
بسیاری از برنامهها قابلیتهای خود را به تعدادی زیردستور تقسیم میکنند؛ برای مثال، برنامهی
svnمیتواند زیردستورهایی مانندsvn checkout،svn updateوsvn commitرا فراخوانی کند. تقسیم قابلیتها به این روش میتواند ایدهای بسیار خوب باشد، بهویژه زمانی که یک برنامه چندین کارکرد مختلف انجام میدهد که به انواع مختلفی از آرگومانهای خط فرمان نیاز دارند.ArgumentParserاز ایجاد چنین زیردستورهایی با متدadd_subparsers()پشتیبانی میکند. متدadd_subparsers()معمولاً بدون هیچ آرگومانی فراخوانی میشود و یک شیء اکشن ویژه برمیگرداند. این شیء تنها یک متد دارد،add_parser()، که یک نام دستور و هرگونه آرگومان سازندهیArgumentParserرا دریافت میکند و یک شیءArgumentParserبرمیگرداند که میتوان آن را مانند حالت معمول اصلاح کرد.توضیح پارامترها:
title - عنوان برای گروه زیرپارسر (sub-parser) در خروجی راهنما؛ بهطور پیشفرض اگر توضیحات ارائه شده باشد، "subcommands" خواهد بود، در غیر این صورت، از عنوان آرگومانهای جایگاهی استفاده میشود
description - توضیح برای گروه زیرپارسرها در خروجی راهنما، بهطور پیشفرض
Noneprog - اطلاعات استفادهای که همراه با راهنمای زیردستور نمایش داده میشود، بهطور پیشفرض نام برنامه و هر آرگومان جایگاهی پیش از آرگومان زیرپارسر (subparser)
parser_class - کلاسی که برای ایجاد نمونههای زیرپارسر استفاده خواهد شد، بهطور پیشفرض کلاس پارسر فعلی (مثلاً
ArgumentParser)action - نوع پایهای اکشنی که باید هنگام مواجهه با این آرگومان در خط فرمان انجام شود
dest - نام ویژگیای که نام زیردستور در آن ذخیره میشود؛ بهطور پیشفرض
Noneاست و هیچ مقداری ذخیره نمیشودrequired - اینکه آیا یک زیردستور باید ارائه شود یا خیر، بهطور پیشفرض
False(در 3.7 افزوده شده است)help - راهنمای گروه زیرپارسرها در خروجی راهنما، بهطور پیشفرض
Nonemetavar - رشتهای که زیردستورهای در دسترس را در راهنما نمایش میدهد؛ بهطور پیشفرض
Noneاست و زیردستورها را در قالب {cmd1, cmd2, ..} نمایش میدهد
چند نمونه کاربرد:
>>> # create the top-level parser >>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('--foo', action='store_true', help='foo help') >>> subparsers = parser.add_subparsers(help='subcommand help') >>> >>> # create the parser for the "a" command >>> parser_a = subparsers.add_parser('a', help='a help') >>> parser_a.add_argument('bar', type=int, help='bar help') >>> >>> # create the parser for the "b" command >>> parser_b = subparsers.add_parser('b', help='b help') >>> parser_b.add_argument('--baz', choices=('X', 'Y', 'Z'), help='baz help') >>> >>> # parse some argument lists >>> parser.parse_args(['a', '12']) Namespace(bar=12, foo=False) >>> parser.parse_args(['--foo', 'b', '--baz', 'Z']) Namespace(baz='Z', foo=True)
توجه داشته باشید که شیء برگرداندهشده از
parse_args()فقط شامل ویژگیهایی برای پارسر اصلی و زیرپارسری خواهد بود که از طریق خط فرمان انتخاب شده است (و نه هیچ زیرپارسر دیگری). بنابراین در مثال بالا، هنگامی که دستورaمشخص شده باشد، فقط ویژگیهایfooوbarوجود دارند، و هنگامی که دستورbمشخص شده باشد، فقط ویژگیهایfooوbazوجود دارند.اگر یک زیرپارسر آرگومانی با همان
destپارسر والد تعریف کند، این دو یک ویژگی فضای نام واحد را به اشتراک میگذارند، بنابراین مقدار پارسر والد حفظ نخواهد شد. کاربران باید برای آنها مقادیرdestمتمایزی تعیین کنند تا هر دو حفظ شوند.بهطور مشابه، هنگامی که یک پیام راهنما از یک زیرپارسر درخواست شود، فقط راهنمای همان پارسر خاص چاپ خواهد شد. پیام راهنما شامل پیامهای پارسر والد یا پارسرهای همسطح نخواهد شد. (با این حال، میتوان با ارائه آرگومان
help=بهadd_parser()مانند بالا، یک پیام راهنما برای هر دستور زیرپارسر ارائه داد.)>>> parser.parse_args(['--help']) usage: PROG [-h] [--foo] {a,b} ... positional arguments: {a,b} subcommand help a a help b b help options: -h, --help show this help message and exit --foo foo help >>> parser.parse_args(['a', '--help']) usage: PROG a [-h] bar positional arguments: bar bar help options: -h, --help show this help message and exit >>> parser.parse_args(['b', '--help']) usage: PROG b [-h] [--baz {X,Y,Z}] options: -h, --help show this help message and exit --baz {X,Y,Z} baz help
متد
add_subparsers()همچنین از آرگومانهای کلیدواژهایtitleوdescriptionپشتیبانی میکند. هنگامی که هر یک وجود داشته باشد، دستورات زیرپارسر (subparser) در گروه خودشان در خروجی راهنما ظاهر میشوند. برای مثال:>>> parser = argparse.ArgumentParser() >>> subparsers = parser.add_subparsers(title='subcommands', ... description='valid subcommands', ... help='additional help') >>> subparsers.add_parser('foo') >>> subparsers.add_parser('bar') >>> parser.parse_args(['-h']) usage: [-h] {foo,bar} ... options: -h, --help show this help message and exit subcommands: valid subcommands {foo,bar} additional help
علاوه بر این،
add_parser()از یک آرگومان اضافی aliases پشتیبانی میکند، که امکان میدهد چندین رشته به یک زیرپارسر یکسان ارجاع داده شوند. این مثال، مانندsvn، نام مستعارcoرا بهعنوان شکل کوتاهی برایcheckoutتعریف میکند:>>> parser = argparse.ArgumentParser() >>> subparsers = parser.add_subparsers() >>> checkout = subparsers.add_parser('checkout', aliases=['co']) >>> checkout.add_argument('foo') >>> parser.parse_args(['co', 'bar']) Namespace(foo='bar')
add_parser()همچنین از یک آرگومان اضافی deprecated پشتیبانی میکند، که به شما امکان میدهد زیرپارسر (subparser) را منسوخ کنید.>>> import argparse >>> parser = argparse.ArgumentParser(prog='chicken.py') >>> subparsers = parser.add_subparsers() >>> run = subparsers.add_parser('run') >>> fly = subparsers.add_parser('fly', deprecated=True) >>> parser.parse_args(['fly']) chicken.py: warning: command 'fly' is deprecated Namespace()
اضافه شده در نسخهی 3.13.
یک روش بهویژه مؤثر برای مدیریت زیردستورها، ترکیب استفاده از متد
add_subparsers()با فراخوانیهایset_defaults()است، بهطوریکه هر زیرپارسر (subparser) بداند کدام تابع پایتون را باید اجرا کند. برای مثال:>>> # subcommand functions >>> def foo(args): ... print(args.x * args.y) ... >>> def bar(args): ... print('((%s))' % args.z) ... >>> # create the top-level parser >>> parser = argparse.ArgumentParser() >>> subparsers = parser.add_subparsers(required=True) >>> >>> # create the parser for the "foo" command >>> parser_foo = subparsers.add_parser('foo') >>> parser_foo.add_argument('-x', type=int, default=1) >>> parser_foo.add_argument('y', type=float) >>> parser_foo.set_defaults(func=foo) >>> >>> # create the parser for the "bar" command >>> parser_bar = subparsers.add_parser('bar') >>> parser_bar.add_argument('z') >>> parser_bar.set_defaults(func=bar) >>> >>> # parse the args and call whatever function was selected >>> args = parser.parse_args('foo 1 -x 2'.split()) >>> args.func(args) 2.0 >>> >>> # parse the args and call whatever function was selected >>> args = parser.parse_args('bar XYZYX'.split()) >>> args.func(args) ((XYZYX))
به این ترتیب، میتوانید اجازه دهید
parse_args()پس از تکمیل تجزیه آرگومانها، کار فراخوانی تابع مناسب را انجام دهد. مرتبط کردن توابع با کنشهایی مانند این، معمولاً سادهترین راه برای مدیریت کنشهای متفاوت هر یک از زیرپارسرهای شما است. با این حال، اگر لازم باشد نام زیرپارسر فراخوانیشده بررسی شود، آرگومان کلیدواژهایdestدر فراخوانیadd_subparsers()کار خواهد کرد:>>> parser = argparse.ArgumentParser() >>> subparsers = parser.add_subparsers(dest='subparser_name') >>> subparser1 = subparsers.add_parser('1') >>> subparser1.add_argument('-x') >>> subparser2 = subparsers.add_parser('2') >>> subparser2.add_argument('y') >>> parser.parse_args(['2', 'frobble']) Namespace(subparser_name='2', y='frobble')
تغییر یافته در نسخهی 3.7: پارامتر جدید الزامی فقط کلیدواژهای.
تغییر یافته در نسخهی 3.14: prog زیرپارسر دیگر تحت تأثیر پیام کاربرد سفارشی در پارسر اصلی قرار نمیگیرد.
اشیای FileType¶
- class argparse.FileType(mode='r', bufsize=-1, encoding=None, errors=None)¶
کارخانهی
FileTypeاشیایی را ایجاد میکند که میتوان آنها را به آرگومان type درArgumentParser.add_argument()ارسال کرد. آرگومانهایی که اشیایFileTypeرا بهعنوان نوع خود دارند، آرگومانهای خط فرمان را بهصورت پروندههایی با حالتها، اندازههای بافر، کدگذاریها و مدیریت خطای درخواستی باز میکنند (برای جزئیات بیشتر، تابعopen()را ببینید):>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--raw', type=argparse.FileType('wb', 0)) >>> parser.add_argument('out', type=argparse.FileType('w', encoding='UTF-8')) >>> parser.parse_args(['--raw', 'raw.dat', 'file.txt']) Namespace(out=<_io.TextIOWrapper name='file.txt' mode='w' encoding='UTF-8'>, raw=<_io.FileIO name='raw.dat' mode='wb'>)
اشیاء FileType شبهآرگومان
'-'را میشناسند و بهطور خودکار آن را برای اشیاءFileTypeقابل خواندن بهsys.stdinو برای اشیاءFileTypeقابل نوشتن بهsys.stdoutتبدیل میکنند:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('infile', type=argparse.FileType('r')) >>> parser.parse_args(['-']) Namespace(infile=<_io.TextIOWrapper name='<stdin>' encoding='UTF-8'>)
توجه
اگر یکی از آرگومانها از FileType استفاده کند و سپس آرگومان بعدی با شکست مواجه شود، خطایی گزارش میشود اما پرونده بهطور خودکار بسته نمیشود. این موضوع همچنین میتواند پروندههای خروجی را بازنویسی کند. در این حالت، بهتر است تا پایان اجرای پارسر صبر کنید و سپس از دستور
withبرای مدیریت پروندهها استفاده کنید.تغییر یافته در نسخهی 3.4: پارامترهای encoding و errors افزوده شدند.
منسوخ شده از نسخهی 3.14.
گروههای آرگومان¶
- ArgumentParser.add_argument_group(title=None, description=None, *[, argument_default][, conflict_handler])¶
بهطور پیشفرض،
ArgumentParserآرگومانهای خط فرمان را هنگام نمایش پیامهای راهنمایی به «آرگومانهای جایگاهی» و «گزینهها» گروهبندی میکند. هرگاه گروهبندی مفهومی بهتری نسبت به این حالت پیشفرض برای آرگومانها وجود داشته باشد، میتوان گروههای مناسب را با استفاده از متدadd_argument_group()ایجاد کرد:>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False) >>> group = parser.add_argument_group('group') >>> group.add_argument('--foo', help='foo help') >>> group.add_argument('bar', help='bar help') >>> parser.print_help() usage: PROG [--foo FOO] bar group: bar bar help --foo FOO foo help
متد
add_argument_group()یک شیء گروه آرگومان برمیگرداند که همانند یکArgumentParserمعمولی، متدadd_argument()را دارد. هنگامی که آرگومانی به گروه اضافه میشود، پارسر با آن همانند یک آرگومان عادی رفتار میکند، اما آن را در پیامهای راهنمایی در گروهی جداگانه نمایش میدهد. متدadd_argument_group()آرگومانهای title و description را میپذیرد که میتوان از آنها برای سفارشیسازی این نمایش استفاده کرد:>>> parser = argparse.ArgumentParser(prog='PROG', add_help=False) >>> group1 = parser.add_argument_group('group1', 'group1 description') >>> group1.add_argument('foo', help='foo help') >>> group2 = parser.add_argument_group('group2', 'group2 description') >>> group2.add_argument('--bar', help='bar help') >>> parser.print_help() usage: PROG [--bar BAR] foo group1: group1 description foo foo help group2: group2 description --bar BAR bar help
پارامترهای اختیاری و فقط کلیدواژهای argument_default و conflict_handler امکان کنترل دقیقتر رفتار گروه آرگومان را فراهم میکنند. این پارامترها همان معنایی را دارند که در سازندهی
ArgumentParserدارند، اما بهطور خاص بر گروه آرگومان اعمال میشوند، نه بر کل پارسر.توجه داشته باشید که هر آرگومانی که در گروههای تعریفشده توسط شما نباشد، در نهایت به بخشهای معمول «آرگومانهای جایگاهی» و «آرگومانهای اختیاری» بازمیگردد.
در هر گروه آرگومان، آرگومانها در خروجی راهنما به همان ترتیبی که افزوده شدهاند نمایش داده میشوند.
منسوخ شده از نسخهی 3.11، در نسخهی 3.14 حذف شده است: فراخوانی
add_argument_group()بر روی یک گروه آرگومان اکنون استثنا پرتاب میکند. این تودرتوسازی هرگز پشتیبانی نمیشد، اغلب بهدرستی کار نمیکرد و بهطور غیرعمد از طریق ارثبری در دسترس قرار گرفته بود.منسوخ شده از نسخهی 3.14: ارسال prefix_chars به
add_argument_group()اکنون منسوخ شده است.
انحصار متقابل¶
- ArgumentParser.add_mutually_exclusive_group(required=False)¶
یک گروه با انحصار متقابل ایجاد کنید.
argparseتضمین میکند که تنها یکی از آرگومانهای گروه با انحصار متقابل در خط فرمان وجود داشته باشد:>>> parser = argparse.ArgumentParser(prog='PROG') >>> group = parser.add_mutually_exclusive_group() >>> group.add_argument('--foo', action='store_true') >>> group.add_argument('--bar', action='store_false') >>> parser.parse_args(['--foo']) Namespace(bar=True, foo=True) >>> parser.parse_args(['--bar']) Namespace(bar=False, foo=False) >>> parser.parse_args(['--foo', '--bar']) usage: PROG [-h] [--foo | --bar] PROG: error: argument --bar: not allowed with argument --foo
متد
add_mutually_exclusive_group()همچنین یک آرگومان required را میپذیرد، تا نشان دهد که حداقل یکی از آرگومانهای مانعالجمع الزامی است:>>> parser = argparse.ArgumentParser(prog='PROG') >>> group = parser.add_mutually_exclusive_group(required=True) >>> group.add_argument('--foo', action='store_true') >>> group.add_argument('--bar', action='store_false') >>> parser.parse_args([]) usage: PROG [-h] (--foo | --bar) PROG: error: one of the arguments --foo --bar is required
توجه کنید که در حال حاضر گروههای آرگومان انحصاریِ متقابل از آرگومانهای title و description متد
add_argument_group()پشتیبانی نمیکنند. بااینحال، یک گروه انحصاریِ متقابل را میتوان به یک گروه آرگومان که دارای عنوان و توضیحات است اضافه کرد. برای مثال:>>> parser = argparse.ArgumentParser(prog='PROG') >>> group = parser.add_argument_group('Group title', 'Group description') >>> exclusive_group = group.add_mutually_exclusive_group(required=True) >>> exclusive_group.add_argument('--foo', help='foo help') >>> exclusive_group.add_argument('--bar', help='bar help') >>> parser.print_help() usage: PROG [-h] (--foo FOO | --bar BAR) options: -h, --help show this help message and exit Group title: Group description --foo FOO foo help --bar BAR bar help
منسوخ شده از نسخهی 3.11، در نسخهی 3.14 حذف شده است: فراخوانی
add_argument_group()یاadd_mutually_exclusive_group()روی یک گروه متقابلاً انحصاری اکنون استثنایی پرتاب میکند. این تودرتوسازی هرگز پشتیبانی نمیشد، اغلب بهدرستی کار نمیکرد و بهطور غیرعمد از طریق ارثبری در دسترس قرار گرفته بود.
پیشفرضهای پارسر¶
- ArgumentParser.set_defaults(**kwargs)¶
بیشتر اوقات، ویژگیهای شیء برگرداندهشده توسط
parse_args()بهطور کامل با بررسی آرگومانهای خط فرمان و کنشهای آرگومان تعیین میشوند.set_defaults()اجازه میدهد برخی ویژگیهای اضافی که بدون هیچگونه بررسی خط فرمان تعیین میشوند، اضافه شوند:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('foo', type=int) >>> parser.set_defaults(bar=42, baz='badger') >>> parser.parse_args(['736']) Namespace(bar=42, baz='badger', foo=736)
توجه داشته باشید که پیشفرضها را میتوان هم در سطح پارسر با استفاده از
set_defaults()و هم در سطح آرگومان با استفاده ازadd_argument()تنظیم کرد. اگر هر دو برای یک آرگومان فراخوانی شوند، آخرین پیشفرض تنظیمشده برای آن آرگومان استفاده میشود:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', default='bar') >>> parser.set_defaults(foo='spam') >>> parser.parse_args([]) Namespace(foo='spam')
پیشفرضهای سطح پارسر میتوانند بهویژه هنگام کار با چندین پارسر مفید باشند. برای دیدن نمونهای از این نوع، به متد
add_subparsers()مراجعه کنید.
- ArgumentParser.get_default(dest)¶
دریافت مقدار پیشفرض برای یک ویژگی فضای نام، که توسط
add_argument()یاset_defaults()تنظیم شده است:>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', default='badger') >>> parser.get_default('foo') 'badger'
چاپ راهنما¶
در بیشتر برنامههای معمول، parse_args() قالببندی و چاپ هرگونه پیام کاربرد یا خطا را بر عهده میگیرد. با این حال، چندین متد قالببندی در دسترس است:
- ArgumentParser.print_usage(file=None)¶
توضیح کوتاهی درباره نحوه فراخوانی
ArgumentParserدر خط فرمان چاپ میکند. اگر file برابرNoneباشد،sys.stdoutدر نظر گرفته میشود.
- ArgumentParser.print_help(file=None)¶
یک پیام راهنما چاپ میکند، شامل نحوه استفاده از برنامه و اطلاعات درباره آرگومانهای ثبتشده در
ArgumentParser. اگر file برابرNoneباشد،sys.stdoutدر نظر گرفته میشود.
همچنین انواعی از این متدها وجود دارند که بهجای چاپ کردن، صرفاً یک رشته را برمیگردانند:
- ArgumentParser.format_usage()¶
رشتهای حاوی توضیح مختصری درباره نحوه فراخوانی
ArgumentParserدر خط فرمان برمیگرداند.
- ArgumentParser.format_help()¶
رشتهای حاوی پیام راهنما، شامل نحوه استفاده از برنامه و اطلاعاتی درباره آرگومانهای ثبتشده در
ArgumentParserبرمیگرداند.
تجزیه جزئی¶
- ArgumentParser.parse_known_args(args=None, namespace=None)¶
گاهی اوقات یک اسکریپت تنها نیاز دارد مجموعهای مشخص از آرگومانهای خط فرمان را مدیریت کند و هر آرگومان ناشناختهای را برای اسکریپت یا برنامه دیگری باقی بگذارد. در این موارد، متد
parse_known_args()میتواند مفید باشد.این متد مشابه
parse_args()عمل میکند، اما برای آرگومانهای اضافی و ناشناخته خطایی پرتاب نمیکند. در عوض، آرگومانهای شناختهشده را تجزیه میکند و یک تاپل دو آیتمی برمیگرداند که شامل فضای نام مقداردهیشده و فهرستی از آرگومانهای ناشناخته است.>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', action='store_true') >>> parser.add_argument('bar') >>> parser.parse_known_args(['--foo', '--badger', 'BAR', 'spam']) (Namespace(bar='BAR', foo=True), ['--badger', 'spam'])
هشدار
قواعد تطبیق پیشوندی بر parse_known_args() اعمال میشوند. پارسر ممکن است گزینهای را، حتی اگر فقط پیشوندی از یکی از گزینههای شناختهشدهاش باشد، بهجای باقی گذاشتن آن در فهرست آرگومانهای باقیمانده، مصرف کند.
سفارشیسازی تجزیه پرونده¶
- ArgumentParser.convert_arg_line_to_args(arg_line)¶
آرگومانهایی که از یک پرونده خوانده میشوند (آرگومان کلیدواژهای fromfile_prefix_chars در سازندهی
ArgumentParserرا ببینید)، بهصورت یک آرگومان در هر خط خوانده میشوند. میتوانconvert_arg_line_to_args()را برای خواندن پیشرفتهتر بازنویسی کرد.این متد یک آرگومان واحد arg_line میگیرد که رشتهای خواندهشده از پرونده آرگومان است. این متد فهرستی از آرگومانهای تجزیهشده از این رشته را برمیگرداند. این متد به ترتیب، یک بار به ازای هر خط خواندهشده از پرونده آرگومان فراخوانی میشود.
یک بازنویسی مفید از این متد، بازنویسیای است که هر کلمهی جداشده با فاصله را بهعنوان یک آرگومان در نظر میگیرد. مثال زیر نحوهی انجام این کار را نشان میدهد:
class MyArgumentParser(argparse.ArgumentParser): def convert_arg_line_to_args(self, arg_line): return arg_line.split()
توجه داشته باشید که با این بازنویسی، آرگومان دیگر نمیتواند شامل فاصله باشد، زیرا هر کلمهای که با فاصله جدا شده باشد، به یک آرگومان جداگانه تبدیل میشود.
متدهای خروج¶
- ArgumentParser.exit(status=0, message=None)¶
این متد برنامه را با status مشخص خاتمه میدهد و در صورت ارائه شدن، پیش از آن یک message را در
sys.stderrچاپ میکند. کاربر میتواند این متد را بازنویسی کند تا این مراحل به شکل متفاوتی مدیریت شوند:class ErrorCatchingArgumentParser(argparse.ArgumentParser): def exit(self, status=0, message=None): if status: raise Exception(f'Exiting because of an error: {message}') exit(status)
- ArgumentParser.error(message)¶
این متد یک پیام کاربرد شامل message را در
sys.stderrچاپ میکند و برنامه را با کد وضعیت ۲ پایان میدهد.
تجزیه درهمآمخته¶
- ArgumentParser.parse_intermixed_args(args=None, namespace=None)¶
- ArgumentParser.parse_known_intermixed_args(args=None, namespace=None)¶
تعدادی از دستورهای یونیکس به کاربر اجازه میدهند آرگومانهای اختیاری را با آرگومانهای جایگاهی در هم بیامیزد. متدهای
parse_intermixed_args()وparse_known_intermixed_args()از این سبک تجزیه پشتیبانی میکنند.این پارسرها از همهی قابلیتهای
argparseپشتیبانی نمیکنند و در صورت استفاده از قابلیتهای پشتیبانینشده، استثنا پرتاب میکنند. بهطور خاص، زیرپارسرها و گروههای متقابلاً انحصاری که شامل هر دو آرگومان اختیاری و جایگاهی هستند، پشتیبانی نمیشوند.مثال زیر تفاوت میان
parse_known_args()وparse_intermixed_args()را نشان میدهد: اولی['2', '3']را بهعنوان آرگومانهای تجزیهنشده برمیگرداند، در حالی که دومی همهی آرگومانهای جایگاهی را درrestجمع میکند.>>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo') >>> parser.add_argument('cmd') >>> parser.add_argument('rest', nargs='*', type=int) >>> parser.parse_known_args('doit 1 --foo bar 2 3'.split()) (Namespace(cmd='doit', foo='bar', rest=[1]), ['2', '3']) >>> parser.parse_intermixed_args('doit 1 --foo bar 2 3'.split()) Namespace(cmd='doit', foo='bar', rest=[1, 2, 3])
parse_known_intermixed_args()یک تاپل دو آیتمی شامل فضای نام پرشده و فهرست رشتههای آرگومان باقیمانده را برمیگرداند.parse_intermixed_args()اگر رشتههای آرگومان تجزیهنشدهی باقیماندهای وجود داشته باشد، خطایی پرتاب میکند.اضافه شده در نسخهی 3.7.
ثبت انواع سفارشی یا کنشهای سفارشی¶
- ArgumentParser.register(registry_name, value, object)¶
گاهی اوقات مطلوب است که در پیامهای خطا از یک رشته سفارشی استفاده شود تا خروجی کاربر پسندتری ارائه شود. در این موارد،
register()میتواند برای ثبت اکشنها یا انواع سفارشی در یک پارسر استفاده شود و به شما امکان میدهد به جای نام شیء فراخوانیپذیر، به نوع با استفاده از نام ثبتشدهی آن ارجاع دهید.متد
register()سه آرگومان میپذیرد — registry_name، مشخصکنندهی رجیستری داخلی که شیء در آن ذخیره میشود (برای مثالaction،type)، value، که کلیدی است که شیء با آن ثبت میشود، و object، شیء فراخوانیپذیر که باید ثبت شود.مثال زیر نشان میدهد که چگونه میتوان یک نوع سفارشی را در یک پارسر ثبت کرد:
>>> import argparse >>> parser = argparse.ArgumentParser() >>> parser.register('type', 'hexadecimal integer', lambda s: int(s, 16)) >>> parser.add_argument('--foo', type='hexadecimal integer') _StoreAction(option_strings=['--foo'], dest='foo', nargs=None, const=None, default=None, type='hexadecimal integer', choices=None, required=False, help=None, metavar=None, deprecated=False) >>> parser.parse_args(['--foo', '0xFA']) Namespace(foo=250) >>> parser.parse_args(['--foo', '1.2']) usage: PROG [-h] [--foo FOO] PROG: error: argument --foo: invalid 'hexadecimal integer' value: '1.2'
استثناها¶
- exception argparse.ArgumentError¶
خطایی ناشی از ایجاد یا استفاده از آرگومان (اختیاری یا جایگاهی).
مقدار رشتهای این استثنا، پیامی است که با اطلاعاتی درباره آرگومانی که باعث ایجاد آن شده، تکمیلشده است.
- exception argparse.ArgumentTypeError¶
هنگامی که در تبدیل یک رشتهی خط فرمان به یک نوع، مشکلی پیش بیاید، پرتاب میشود.
راهنماها و آموزشها