繁体   English   中英

使用子解析器时,如何使argparse参数可选?

[英]How do I make an argparse argument optional when using subparsers?

我正在研究一个简单的Git / Redmine胶水脚本,但是在Python argparse模块中使用可选参数时遇到了一些困难。

使用以下代码:

import argparse

class MyClass:
    def StartWork(self, issueNumber, **kwargs):
        if issueNumber is None:
            issueNumber = input("please enter an issue number: ")
        else:
            print("issue number detected")
        print(issueNumber)

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='MyClass-command', help='Command to perform')
subparsers.required = True
startWorkParser = subparsers.add_parser('startwork', help='Command to begin work on a new branch')
startWorkParser.add_argument("issuenumber", type=int, help="The issue number used to create a local branch based on the specified issue number", nargs='?', default=None)
startWorkParser.set_defaults(func=MyClass.StartWork)

# Parse the arguments to make sure we have all the information requried to actually do something.
args = parser.parse_args()
mc = MyClass()

try:
    args.func(mc, **vars(args))
except AssertionError as e:
    print("Error: "+str(e))

# Parse the arguments to make sure we have all the information required to actually do something.
args = parser.parse_args()

我希望这样的电话:

python MyClass.py startwork

...导致提示用户输入问题编号。 相反,我得到:

Traceback (most recent call last):
  File "C:\Projects\RedmnieGlue\MyClass.py", line 23, in <module>
    args.func(mc, **vars(args))
TypeError: StartWork() missing 1 required positional argument: 'issueNumber'

那么,为什么nargs='?' 在这里不占优势?

编辑

如果我这样称呼它:

python MyClass.py startwork -h

我得到这个:

usage: class1.py startwork [-h] [issuenumber]

positional arguments:
  issuenumber  The issue number used to create a local branch based on the
               specified issue number

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

...这(基于[]周围issuenumber )建议对我来说理解这是一个可选参数,但事情是防止它工作,我希望它。 可能与我对arg解析器使用子subparsers和调用方法有关?

如果在函数调用之前打印vars(args)的内容,如下所示:

print(vars(args))
args.func(mc, **vars(args))

然后,您可以轻松地验证参数解析器是否存在问题。 通过不带参数的脚本调用(例如python myscript.py ),您将获得以下输出:

{'MyClass-command': 'startwork', 'issuenumber': None, 'func': <function MyClass.StartWork at 0x000000493898C510>}

如您所见, issuenumber实际上在该词典中,并且确实获得了默认值。 因此,您看到的错误不是由于参数解析器引起的(这也不是argparse错误,因此对参数的验证( issuenumber是可选的)是绝对正确的)。

相反,出问题的是,在使用**vars(args)时,未将参数issuenumber传递给位置参数。 不会发生的原因实际上很简单:

字典键是issuenumber ; 该函数期望一个issueNumber (注意大写N )。 因此,要么更改函数以使用小写的issuenumber ,要么更改参数解析器以将值存储在issueNumber

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM