我的目标是使用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()
答案 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')):