GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing python.github.io — آموزش Argparse آموزش Argparse¶این آموزش در نظر دارد مقدمهای ملایم به نکته کتابخانه استاندارد شامل دو کتابخانه دیگر است که مستقیماً به پردازش پارامترهای خط فرمان مرتبط هستند: ماژول مفاهیم¶بیایید با استفاده از دستور ls، نوع قابلیتهایی را که در این آموزش مقدماتی بررسی خواهیم کرد، نشان دهیم: $ ls cpython devguide prog.py pypy rm-unused-function.patch $ ls pypy ctypes_configure demo dotviewer include lib_pypy lib-python ... $ ls -l total 20 drwxr-xr-x 19 wena wena 4096 Feb 18 18:51 cpython drwxr-xr-x 4 wena wena 4096 Feb 8 12:04 devguide -rwxr-xr-x 1 wena wena 535 Feb 19 00:05 prog.py drwxr-xr-x 14 wena wena 4096 Feb 7 00:59 pypy -rw-r--r-- 1 wena wena 741 Feb 18 01:01 rm-unused-function.patch $ ls --help Usage: ls [OPTION]... [FILE]... List information about the FILEs (the current directory by default). Sort entries alphabetically if none of -cftuvSUX nor --sort is specified. ... چند مفهوم که میتوانیم از ۴ دستور بیاموزیم:
مبانی¶بیایید با مثال بسیار سادهای شروع کنیم که (تقریباً) هیچ کاری انجام نمیدهد: import argparse parser = argparse.ArgumentParser() parser.parse_args() نتیجهی اجرای کد به شرح زیر است: $ python prog.py $ python prog.py --help usage: prog.py [-h] options: -h, --help show this help message and exit $ python prog.py --verbose usage: prog.py [-h] prog.py: error: unrecognized arguments: --verbose $ python prog.py foo usage: prog.py [-h] prog.py: error: unrecognized arguments: foo آنچه اتفاق میافتد به این صورت است:
معرفی آرگومانهای جایگاهی¶یک مثال: import argparse parser = argparse.ArgumentParser() parser.add_argument("echo") args = parser.parse_args() print(args.echo) و اجرای کد: $ python prog.py usage: prog.py [-h] echo prog.py: error: the following arguments are required: echo $ python prog.py --help usage: prog.py [-h] echo positional arguments: echo options: -h, --help show this help message and exit $ python prog.py foo foo آنچه در حال رخ دادن است:
با این حال توجه داشته باشید که، اگرچه نمایش راهنما زیبا به نظر میرسد، اما در حال حاضر آنقدر که میتواند مفید نیست. برای مثال میبینیم که import argparse parser = argparse.ArgumentParser() parser.add_argument("echo", help="echo the string you use here") args = parser.parse_args() print(args.echo) و این نتیجه را میگیریم: $ python prog.py -h usage: prog.py [-h] echo positional arguments: echo echo the string you use here options: -h, --help show this help message and exit حال، چطور است کاری حتی مفیدتر انجام دهیم: import argparse parser = argparse.ArgumentParser() parser.add_argument("square", help="display a square of a given number") args = parser.parse_args() print(args.square**2) نتیجهی اجرای کد به شرح زیر است: $ python prog.py 4 Traceback (most recent call last): File "prog.py", line 5, in <module> print(args.square**2) TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int' این کار چندان خوب پیش نرفت. دلیلش این است که import argparse parser = argparse.ArgumentParser() parser.add_argument("square", help="display a square of a given number", type=int) args = parser.parse_args() print(args.square**2) نتیجهی اجرای کد به شرح زیر است: $ python prog.py 4 16 $ python prog.py four usage: prog.py [-h] square prog.py: error: argument square: invalid int value: 'four' این بهخوبی پیش رفت. برنامه اکنون حتی در صورت ورودی بد و غیرمجاز، پیش از ادامه بهصورت مفیدی خارج میشود. معرفی آرگومانهای اختیاری¶تاکنون با آرگومانهای جایگاهی کار کردهایم. بگذارید نگاهی بیندازیم به چگونگی افزودن آرگومانهای اختیاری: import argparse parser = argparse.ArgumentParser() parser.add_argument("--verbosity", help="increase output verbosity") args = parser.parse_args() if args.verbosity: print("verbosity turned on") و خروجی: $ python prog.py --verbosity 1 verbosity turned on $ python prog.py $ python prog.py --help usage: prog.py [-h] [--verbosity VERBOSITY] options: -h, --help show this help message and exit --verbosity VERBOSITY increase output verbosity $ python prog.py --verbosity usage: prog.py [-h] [--verbosity VERBOSITY] prog.py: error: argument --verbosity: expected one argument آنچه اتفاق میافتد به این صورت است:
مثال بالا هر مقدار عدد صحیحی را برای import argparse parser = argparse.ArgumentParser() parser.add_argument("--verbose", help="increase output verbosity", action="store_true") args = parser.parse_args() if args.verbose: print("verbosity turned on") و خروجی: $ python prog.py --verbose verbosity turned on $ python prog.py --verbose 1 usage: prog.py [-h] [--verbose] prog.py: error: unrecognized arguments: 1 $ python prog.py --help usage: prog.py [-h] [--verbose] options: -h, --help show this help message and exit --verbose increase output verbosity آنچه اتفاق میافتد به این صورت است:
گزینههای کوتاه¶اگر با استفاده از خط فرمان آشنا باشید، متوجه خواهید شد که هنوز به موضوع شکلهای کوتاه گزینهها نپرداختهام. این موضوع کاملاً ساده است: import argparse parser = argparse.ArgumentParser() parser.add_argument("-v", "--verbose", help="increase output verbosity", action="store_true") args = parser.parse_args() if args.verbose: print("verbosity turned on") و به این صورت است: $ python prog.py -v پرگویی روشن شد $ python prog.py --help طرز استفاده: prog.py [-h] [-v] گزینهها: -h, --help نمایش این پیام راهنما و خروج -v, --verbose افزایش پرگویی خروجی توجه داشته باشید که قابلیت جدید نیز در متن راهنما منعکس شده است. ترکیب آرگومانهای جایگاهی و اختیاری¶برنامهی ما از نظر پیچیدگی همچنان در حال رشد است: import argparse parser = argparse.ArgumentParser() parser.add_argument("square", type=int, help="display a square of a given number") parser.add_argument("-v", "--verbose", action="store_true", help="increase output verbosity") args = parser.parse_args() answer = args.square**2 if args.verbose: print(f"the square of {args.square} equals {answer}") else: print(answer) و اکنون خروجی: $ python prog.py usage: prog.py [-h] [-v] square prog.py: error: the following arguments are required: square $ python prog.py 4 16 $ python prog.py 4 --verbose the square of 4 equals 16 $ python prog.py --verbose 4 the square of 4 equals 16
چطور است که توانایی داشتن چندین مقدار پرگویی (verbosity) را به این برنامهمان بازگردانیم و واقعاً از آنها استفاده کنیم: import argparse parser = argparse.ArgumentParser() parser.add_argument("square", type=int, help="display a square of a given number") parser.add_argument("-v", "--verbosity", type=int, help="increase output verbosity") args = parser.parse_args() answer = args.square**2 if args.verbosity == 2: print(f"the square of {args.square} equals {answer}") elif args.verbosity == 1: print(f"{args.square}^2 == {answer}") else: print(answer) و خروجی: $ python prog.py 4 16 $ python prog.py 4 -v usage: prog.py [-h] [-v VERBOSITY] square prog.py: error: argument -v/--verbosity: expected one argument $ python prog.py 4 -v 1 4^2 == 16 $ python prog.py 4 -v 2 the square of 4 equals 16 $ python prog.py 4 -v 3 16 همهی اینها خوب به نظر میرسند، بهجز آخرین مورد که یک خطا را در برنامهی ما آشکار میکند. بیایید آن را با محدود کردن مقادیری که گزینهی import argparse parser = argparse.ArgumentParser() parser.add_argument("square", type=int, help="display a square of a given number") parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2], help="increase output verbosity") args = parser.parse_args() answer = args.square**2 if args.verbosity == 2: print(f"the square of {args.square} equals {answer}") elif args.verbosity == 1: print(f"{args.square}^2 == {answer}") else: print(answer) و خروجی: $ python prog.py 4 -v 3 usage: prog.py [-h] [-v {0,1,2}] square prog.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2) $ python prog.py 4 -h usage: prog.py [-h] [-v {0,1,2}] square positional arguments: square display a square of a given number options: -h, --help show this help message and exit -v, --verbosity {0,1,2} increase output verbosity توجه داشته باشید که این تغییر هم در پیام خطا و هم در رشته راهنما منعکس میشود. اکنون، بیایید از رویکرد متفاوتی برای بازی با سطح جزئیات استفاده کنیم، که نسبتاً رایج است. این روش همچنین با شیوهای که پرونده اجرایی CPython آرگومان سطح جزئیات خود را مدیریت میکند مطابقت دارد (خروجی import argparse parser = argparse.ArgumentParser() parser.add_argument("square", type=int, help="display the square of a given number") parser.add_argument("-v", "--verbosity", action="count", help="increase output verbosity") args = parser.parse_args() answer = args.square**2 if args.verbosity == 2: print(f"the square of {args.square} equals {answer}") elif args.verbosity == 1: print(f"{args.square}^2 == {answer}") else: print(answer) ما اکشن دیگری به نام "count" برای شمارش تعداد دفعات استفاده از گزینههای خاص معرفی کردهایم. $ python prog.py 4 16 $ python prog.py 4 -v 4^2 == 16 $ python prog.py 4 -vv the square of 4 equals 16 $ python prog.py 4 --verbosity --verbosity the square of 4 equals 16 $ python prog.py 4 -v 1 usage: prog.py [-h] [-v] square prog.py: error: unrecognized arguments: 1 $ python prog.py 4 -h usage: prog.py [-h] [-v] square positional arguments: square display a square of a given number options: -h, --help show this help message and exit -v, --verbosity increase output verbosity $ python prog.py 4 -vvv 16
بیایید آن را اصلاح کنیم: import argparse parser = argparse.ArgumentParser() parser.add_argument("square", type=int, help="display a square of a given number") parser.add_argument("-v", "--verbosity", action="count", help="increase output verbosity") args = parser.parse_args() answer = args.square**2 # bugfix: replace == with >= if args.verbosity >= 2: print(f"the square of {args.square} equals {answer}") elif args.verbosity >= 1: print(f"{args.square}^2 == {answer}") else: print(answer) و این چیزی است که به دست میدهد: $ python prog.py 4 -vvv the square of 4 equals 16 $ python prog.py 4 -vvvv the square of 4 equals 16 $ python prog.py 4 Traceback (most recent call last): File "prog.py", line 11, in <module> if args.verbosity >= 2: TypeError: '>=' not supported between instances of 'NoneType' and 'int'
بیایید آن اشکال را برطرف کنیم: import argparse parser = argparse.ArgumentParser() parser.add_argument("square", type=int, help="display a square of a given number") parser.add_argument("-v", "--verbosity", action="count", default=0, help="increase output verbosity") args = parser.parse_args() answer = args.square**2 if args.verbosity >= 2: print(f"the square of {args.square} equals {answer}") elif args.verbosity >= 1: print(f"{args.square}^2 == {answer}") else: print(answer) ما همین حالا کلیدواژهی دیگری به نام و: $ python prog.py 4 16 شما میتوانید فقط با آنچه تاکنون آموختهایم بسیار پیش بروید، و ما تنها سطح آن را خراش دادهایم. ماژول کمی پیشرفتهتر¶اگر بخواهیم برنامهی کوچک خود را برای محاسبهی توانهای دیگر، نه فقط مربعها، گسترش دهیم: import argparse parser = argparse.ArgumentParser() parser.add_argument("x", type=int, help="the base") parser.add_argument("y", type=int, help="the exponent") parser.add_argument("-v", "--verbosity", action="count", default=0) args = parser.parse_args() answer = args.x**args.y if args.verbosity >= 2: print(f"{args.x} to the power {args.y} equals {answer}") elif args.verbosity >= 1: print(f"{args.x}^{args.y} == {answer}") else: print(answer) خروجی: $ python prog.py usage: prog.py [-h] [-v] x y prog.py: error: the following arguments are required: x, y $ python prog.py -h usage: prog.py [-h] [-v] x y positional arguments: x the base y the exponent options: -h, --help show this help message and exit -v, --verbosity $ python prog.py 4 2 -v 4^2 == 16 توجه کنید که تاکنون از سطح پرگویی برای تغییر متنی که نمایش داده میشود استفاده کردهایم. مثال زیر بهجای آن از سطح پرگویی برای نمایش متن بیشتر استفاده میکند: import argparse parser = argparse.ArgumentParser() parser.add_argument("x", type=int, help="the base") parser.add_argument("y", type=int, help="the exponent") parser.add_argument("-v", "--verbosity", action="count", default=0) args = parser.parse_args() answer = args.x**args.y if args.verbosity >= 2: print(f"Running '{__file__}'") if args.verbosity >= 1: print(f"{args.x}^{args.y} == ", end="") print(answer) خروجی: $ python prog.py 4 2 16 $ python prog.py 4 2 -v 4^2 == 16 $ python prog.py 4 2 -vv Running 'prog.py' 4^2 == 16 مشخص کردن آرگومانهای مبهم¶هنگامی که در تشخیص اینکه یک آرگومان جایگاهی است یا برای یک آرگومان است، ابهام وجود داشته باشد، میتوان از >>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('-n', nargs='+') >>> parser.add_argument('args', nargs='*') >>> # ambiguous, so parse_args assumes it's an option >>> parser.parse_args(['-f']) usage: PROG [-h] [-n N [N ...]] [args ...] PROG: error: unrecognized arguments: -f >>> parser.parse_args(['--', '-f']) Namespace(args=['-f'], n=None) >>> # ambiguous, so the -n option greedily accepts arguments >>> parser.parse_args(['-n', '1', '2', '3']) Namespace(args=[], n=['1', '2', '3']) >>> parser.parse_args(['-n', '1', '--', '2', '3']) Namespace(args=['2', '3'], n=['1']) گزینههای متعارض¶تاکنون، با دو متد از یک نمونهی import argparse parser = argparse.ArgumentParser() group = parser.add_mutually_exclusive_group() group.add_argument("-v", "--verbose", action="store_true") group.add_argument("-q", "--quiet", action="store_true") parser.add_argument("x", type=int, help="the base") parser.add_argument("y", type=int, help="the exponent") args = parser.parse_args() answer = args.x**args.y if args.quiet: print(answer) elif args.verbose: print(f"{args.x} to the power {args.y} equals {answer}") else: print(f"{args.x}^{args.y} == {answer}") برنامهی ما اکنون سادهتر است و برخی قابلیتها را بهمنظور نمایش از دست دادهایم. به هر حال، خروجی به این صورت است: $ python prog.py 4 2 4^2 == 16 $ python prog.py 4 2 -q 16 $ python prog.py 4 2 -v 4 to the power 2 equals 16 $ python prog.py 4 2 -vq usage: prog.py [-h] [-v | -q] x y prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose $ python prog.py 4 2 -v --quiet usage: prog.py [-h] [-v | -q] x y prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose این باید بهراحتی قابلفهم باشد. آن خروجی پایانی را افزودهام تا بتوانید نوع انعطافپذیریای را که در اختیار دارید ببینید، یعنی ترکیب گزینههای بلندبا با گزینههای کوتاهبا. پیش از آنکه به پایان برسیم، احتمالاً میخواهید هدف اصلی برنامهی خود را به کاربران خود بگویید، فقط برای حالتی که نمیدانند: import argparse parser = argparse.ArgumentParser(description="calculate X to the power of Y") group = parser.add_mutually_exclusive_group() group.add_argument("-v", "--verbose", action="store_true") group.add_argument("-q", "--quiet", action="store_true") parser.add_argument("x", type=int, help="the base") parser.add_argument("y", type=int, help="the exponent") args = parser.parse_args() answer = args.x**args.y if args.quiet: print(answer) elif args.verbose: print(f"{args.x} to the power {args.y} equals {answer}") else: print(f"{args.x}^{args.y} == {answer}") توجه کنید که تفاوت اندکی در متن کاربرد وجود دارد. به $ python prog.py --help نحوه استفاده: prog.py [-h] [-v | -q] x y X را به توان Y محاسبه میکند آرگومانهای جایگاهی: x پایه y توان گزینهها: -h, --help نمایش این پیام راهنما و خروج -v, --verbose -q, --quiet چگونه خروجی argparse را ترجمه کنیم¶خروجیهای ماژول برای مثال، در این خروجی $ python prog.py --help نحوه استفاده: prog.py [-h] [-v | -q] x y X را به توان Y محاسبه میکند آرگومانهای جایگاهی: x پایه y توان گزینهها: -h, --help نمایش این پیام راهنما و خروج -v, --verbose -q, --quiet رشتههای برای ترجمهی این رشتهها، ابتدا باید آنها را به یک پرونده $ pybabel extract -o messages.po /usr/lib/python3.12/argparse.py این دستور تمام رشتههای ترجمهپذیر را از ماژول شما میتوانید با استفاده از این اسکریپت، محل ماژول import argparse print(argparse.__file__) پس از اینکه پیامهای موجود در پرونده برای ترجمهی رشتههای خودتان در خروجی مبدلهای نوع سفارشی¶ماژول هنگام استفاده از یک مبدل نوع سفارشی، میتوانید از هر فراخوانیپذیری که یک آرگومان رشتهای دریافت میکند (مقدار آرگومان) و مقدار تبدیلشده را برمیگرداند، استفاده کنید. با این حال، اگر نیاز به مدیریت حالتهای پیچیدهتر دارید، میتوانید بهجای آن از یک کلاس اکشنسفارشی با پارامتر action استفاده کنید. برای مثال، فرض کنید میخواهید آرگومانهایی با پیشوندهای مختلف را مدیریت کنید و آنها را بر همان اساس پردازش کنید: import argparse parser = argparse.ArgumentParser(prefix_chars='-+') parser.add_argument('-a', metavar='<value>', action='append', type=lambda x: ('-', x)) parser.add_argument('+a', metavar='<value>', action='append', type=lambda x: ('+', x)) args = parser.parse_args() print(args) خروجی: $ python prog.py -a value1 +a value2 Namespace(a=[('-', 'value1'), ('+', 'value2')]) در این مثال، ما:
بدون مبدلهای نوع سفارشی، نتیجهگیری¶ماژول
© حق نشر 2001 Python Software Foundation.
این صفحه تحت مجوز بنیاد نرمافزار پایتون نسخه ۲ منتشر شده است. مثالها، دستورالعملها، و سایر کدهای موجود در مستندات همچنین تحت مجوز بدون بند BSD منتشر شدهاند. برای اطلاعات بیشتر به تاریخچه و مجوز مراجعه کنید. بنیاد نرمافزار پایتون یک شرکت غیرانتفاعی است. لطفاً کمک مالی کنید. آخرین بهروزرسانی در نوامبر 12, 2026 (06:19 UTC). آیا اشکالی یافتید؟ ساخته شده با Sphinx 9.1.0. |
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |