给定一个小型解析器:
from argparse import ArgumentError, ArgumentParser
p = ArgumentParser()
p.add_argument('x', choices=['1', '2'])
p.add_argument('--y', required=False)
p.parse_args('1 --y 2'.split()) # this would work
p.parse_args('1'.split()) # this would work also
但是,我想确保如果 x=='1'
,则 --y
将获得一个值。我的实现是这样的:
args = p.parse_args('1 --y 2'.split())
if args.x=='1' and not args.y:
raise ArgumentError('blah')
有内部 argparse 方法可以做到这一点吗?当 argparse 抛出解析错误时看起来好多了
更好的是,我希望当 x=='1'
时需要 --y
参数,而当 x== 时不允许使用 --y
参数'2'
“我想确保如果 x
== '1',则 --y
将获得一个值”
你可以使用这个:
from argparse import ArgumentParser
from sys import argv
p = ArgumentParser(prog='MyParser')
yIsRequired = (argv[1] == '1') # True if x == '1' else False
p.add_argument('x') # Positional argument
p.add_argument(
'--y', # Optional argument
required=yIsRequired,
)
p = p.parse_args()
都经过测试了。这段代码:
更好的是,我希望当 x=='1' 时需要 --y 参数,而当 x=='2'' 时不允许使用 --y 参数
给你:
from argparse import ArgumentParser
import sys
p = ArgumentParser(prog='Demo')
yIsRequired = (sys.argv[1] == '1')
p.add_argument('x')
p.add_argument(
'--y',
required=yIsRequired,
)
if sys.argv[1] == '2' and '--y' in sys.argv: # If x == 2 and y has a value
sys.stderr.write('Demo: error: argument --y not allowed\n') # Write error to standard error output
sys.exit(1) # Exit with non-zero exit code
p = p.parse_args()
结论:
sys.argv
包含传递给脚本的所有参数(它是一个列表
)
- 您可以使用
sys.argv
检查参数是否已传递( bool 逻辑)
- 参见this question和 this有关删除/禁用参数的帮助。答案有很多,但很多都值得一读。
我是一名优秀的程序员,十分优秀!