带plac的可选参数的默认值和非默认值

时间:2018-12-07 06:11:28

标签: python

我的目标是使用plac在命令行中运行脚本,所有参数均为可选,并具有默认值。

不带参数:python my_script.py。它运行完美。

带参数:python my_script.py -r "foobar"。我收到NoneType异常,这表明正在传递默认值而不是自定义值。

def my_function(param1=None, param2=3, param3=1, param4=None):
    ...

def main(p1: ("param1", 'option', 'r'), p2: ("param2", 'option', 's'), p3: ("param3", 'option', 't'), p4: ("param4", 'option', 'u')):
    my_function(p1, p2, p3, p4)

if __name__ == '__main__':
    import plac; plac.call(main)

当我尝试在主函数中添加默认参数时也失败了:

(p1: ("param1", 'option', 'r')=None, ...)

或在调用函数plac中:

plac.call(main(p1=None, ...)

docs中也找不到任何提及或示例。

编辑1:

将代码更改为:

def main(p1=("param1", 'option', 'r'), p2=("param2", 'option', 's'), p3=("param3", 'option', 't'), p4=("param4", 'option', 'u')):

我遇到以下错误:

python my_script.py -r "foobar"
usage: my_script.py [-h] [arg1] [arg2] [arg3] [arg4]
my_script.py: error: unrecognized arguments: -r

对于长参数:

python my_script.py param1 "foobar"
TypeError: Expected 'param1' of type <str>. Got <class 'tuple'>

编辑2:

我最终使用click library代替了plac。并且正在工作。

import click

@click.command()
@click.option('-r', '--param1', default=None)
...
def my_function(param1, ...):
    ...

if __name__ == '__main__':
    my_function()

1 个答案:

答案 0 :(得分:0)

def my_function(param1=None, param2=3, param3=1, param4=None):

看起来不错。但是,在主标题中,我认为您没有尝试提供默认参数

def main(p1: ("param1", 'option', 'r'), p2: ("param2", 'option', 's'), p3: ("param3", 'option', 't'), p4: ("param4", 'option', 'u')):  

您可以传递以下内容:

def main(p1= ("param1", 'option', 'r'), p2= ("param2", 'option', 's')):