class StartAction(argparse.Action):
def __call__(self, parser, namespace, values, option_string=None):
print "Hello"
start.add_argument('-s', '--start', action=StartAction)
Run Code Online (Sandbox Code Playgroud)
我知道通常让行为像'store_true'会阻止参数的要求,但是有没有办法使用自定义动作并且仍然不需要传递参数?
所以我想要的是:
python example.py -s
你好
mgi*_*son 17
尝试添加nargs=0到您的start.add_argument:
start.add_argument('-s', '--start', action=StartAction, nargs=0)
Run Code Online (Sandbox Code Playgroud)
正如mgilson所建议的 nargs=0那样。由于它是您的操作所固有的,因此将其放入操作中:
class StartAction(argparse.Action):
def __init__(self, nargs=0, **kw):
super().__init__(nargs=nargs, **kw)
def __call__(self, parser, namespace, values, option_string=None):
print "Hello"
start.add_argument('-s', '--start', action=StartAction)
Run Code Online (Sandbox Code Playgroud)
这样您就可以实现所需的行为,而不必添加nargs=0到每个add_argument()呼叫中。如果您有多个以相同方式工作的参数,则很整洁。
但是,用户仍然可以覆盖默认设置,nargs=0该默认设置对于您的用例来说很愚蠢,如问题所示。因此,我将其强制执行:
class StartAction(argparse.Action):
def __init__(self, nargs=0, **kw):
if nargs != 0:
raise ValueError('nargs for StartAction must be 0; it is '
'just a flag.')
super().__init__(nargs=nargs, **kw)
def __call__(self, parser, namespace, values, option_string=None):
print "Hello"
Run Code Online (Sandbox Code Playgroud)
对于在 2020 年发现此问题的任何人:如果您尝试在 python3 的最新 argparse 包中传递 nargs=0 ,则会出现错误:
ValueError: nargs for store actions must be != 0; if you have nothing to store, actions such as store true or store const may be more appropriate
Run Code Online (Sandbox Code Playgroud)
您可能正在寻找的解决方案是传递 action="store_const" 和 const=True
例子:
parser = argparse.ArgumentParser
parser.add_argument('-s', '--start', help='Start script or whatever', action="store_const", const=True)
Run Code Online (Sandbox Code Playgroud)
当 -s 参数传递给 main/脚本的其余部分时,这会将 parser.start 的值设置为“True”。
| 归档时间: |
|
| 查看次数: |
4508 次 |
| 最近记录: |