gpt4 book ai didi

python - 如何检查并引发没有命令行参数的错误

转载 作者:行者123 更新时间:2023-11-28 18:45:55 24 4
gpt4 key购买 nike

我有一个 argparsing 程序:

导入参数分析

def main():
p = argparse.ArgumentParser()
help_str = {'rule': 'Blah blah blah and stuff.'}
p.add_argument('-r', '--rule', action="store", type=str, dest='rule', help=help_str['rule'])
p.set_defaults(rule='string')
args = p.parse_args()

因此,我的命令行输入:

username@compname:~$python progname.py -r/--rule 'something'

我正在想办法输入:

username@compname:~$python progname.py -r/--rule

并出现我自己的错误消息:

print '\n    Error: no input value for rule:'
print ' resetting rule to default value.'
args.rule = 'string'

在此之后,规则值应打印为“字符串”

对不起,我对 Python 只略微流利。我尝试过使用 try/except block 甚至 sys.argv[2](尽管我可能做错了什么。)这是我所有解决方案中不断出现的错误(对类型和值之外的错误不是很熟悉) :

progname.py: error: argument -r/--rule: expected one argument

感谢任何帮助。

最佳答案

p = argparse.ArgumentParser()
p.add_argument('-r', '--rule', nargs='?', default='string')
args = p.parse_args()
print args

with nargs='?' 如果在没有参数的情况下调用,则生成 Namespace(rule='string')。对于 -r,args 是 Namespace(rule=None)。和 Namespace(rule='something')-r something

让我们添加几行代码

if args.rule is None:
print '\n Error: no input value for rule:'
print ' resetting rule to default value.'
args.rule = 'string'
print args

现在带有“-r”(或--rule)的输出是:

Namespace(rule=None)

Error: no input value for rule:
resetting rule to default value.
Namespace(rule='string')

其他情况同理

如果我删除 defaultp.add_argument('-r', '--rule', nargs='?'),无参数情况也会产生此自定义“错误消息”,因为默认值(在 argparse 中)是

可以使用自定义 typeaction 添加自定义错误检查,但我认为在使用 argparse 后测试 None 更简单,也更容易理解。

我建议将此错误消息 更改为警告。错误通常会终止程序;警告打印消息并继续。


这是当 nargs=2(或其他固定的东西)时的解决方案。这不是一个微不足道的更改,因为它涉及重新定义 error 方法(记录在 argparse 文档的末尾),然后捕获它产生的错误。 error方法无法访问Namespace(args),也无法继续parse_args。因此,如果 rule 参数有问题,它就无法处理任何其他参数。

class MyParser(argparse.ArgumentParser):
def error(self, message):
if 'rule' in message:
message = 'wrong number of input values for rule'
raise argparse.ArgumentError(None,message)
# cannot access namespace or continue parsing
else:
super(MyParser, self).error(message)

p = MyParser()
p.add_argument('-r', '--rule', nargs=2)
try:
args = p.parse_args()
except argparse.ArgumentError as e:
print e
args = argparse.Namespace(rule='default')
# create a namespace with this default value
print args

请记住,nargs 有两个用途:- 如果给出了错误数量的参数字符串,则引发错误- 在多个 Action 之间分配多个参数字符串(由 add_argument 创建的东西)。

例如,如果您有多个位置变量,分别采用 1,2 和 * 参数,则第二个尤其明显。它是 argparse 的一个重要的新颖特性,至少相对于早期的 Python 解析器而言是这样。虽然可以对其进行调整,但很难完全重新定义它。

如果参数允许,您可以使用 nargs='*' 而不是 '?',并在字符串数不是 '2'(或其他)时发出警告。

关于python - 如何检查并引发没有命令行参数的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20276949/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com