我有一个名为program.py的程序,并且我正在使用argparse进行参数解析。

我有两种运行以下二进制文件的方式:
1)模拟,不需要参数
2)非模拟,需要很多参数

我希望程序接受

python program --simulation


要么

python program arg1 arg2 arg3 arg4


需要所有“参数”的地方。

我认为做到这一点的唯一方法是在所有字段中添加“ required = False”并手动检查逻辑,但是我想知道是否还有更优雅的方法。

这是我的代码的简化版本

def get_args():
    parser = argparse.ArgumentParser(description = "program")
    parser.add_argument("arg1", type = bool)
    parser.add_argument("arg2" ,type = str)
    parser.add_argument("arg3", type = int)
    parser.add_argument("arg4", type = str)
    parser.add_argument("--simulation")
    args = parser.parse_args()
    return args

最佳答案

argparse不能那么聪明。但是,在简单的情况下,您可以“帮助”它选择正确的选项来进行解析:

def get_args(args=sys.argv[1:]):
    parser = argparse.ArgumentParser(description = "program")
    if args and args[0].startswith("--"):
        parser.add_argument("--simulation")
    else:
        parser.add_argument("arg1", type = bool)
        parser.add_argument("arg2" ,type = str)
        parser.add_argument("arg3", type = int)
        parser.add_argument("arg4", type = str)
    args = parser.parse_args(args=args)
    return args


所以print(get_args("--simulation xx".split()))产生:

Namespace(simulation='xx')


因为第一个参数以--开头。其他任何选项都无法按预期进行命令行解析。

print(get_args("True foo 3 bar".split()))产量:

Namespace(arg1=True, arg2='foo', arg3=3, arg4='bar')


忘记4个位置参数之一,命令行解析将无法按预期进行。

顺便说一句,我添加了一个默认参数,如果忽略该参数,将从系统参数中读取(就像您的代码中所做的一样)。另外,您可以从文本文件中读取并传递args令牌。因此,测试和创建可以使用其他模块的参数调用的模块更容易,而无需通过sys.argv进行修改。

10-08 08:26
查看更多