从命令行获取参数,然后从文件获取参数,然后从默认值获取

Ana*_*ory 0 python argparse

我有一个python程序,它运行取决于一些参数.比方说,其中一个参数C的默认值为3.因此,当我在没有任何参数的情况下运行它时,它会

$ python parsing.py
C=3
Run Code Online (Sandbox Code Playgroud)

当我为初始数据加载文件时,它可以从该文件中获取一些参数值.例如,如果我的文件MakeC5说程序应该运行C=5,我会得到

$ python parsing.py --file=MakeC5
C=5
Run Code Online (Sandbox Code Playgroud)

另一方面,如果我将C的不同值指定为可选参数,则采用该值,并且优先于文件中的值.

$ python parsing.py --C=4
C=4

$ python parsing.py --file=MakeC5 --C=4
C=4
Run Code Online (Sandbox Code Playgroud)

到这里,我可以检查命令行上指定的值是否与默认值不同,否则从文件中取出一个,如同

if parameters.C == parser.get_default('C'):
    parameters.C = load_file(parameters.file)["C"]
Run Code Online (Sandbox Code Playgroud)

但是,如果我在命令行中给出C的默认值,则此方法不起作用

$ python parsing.py --file=MakeC5 --C=3
C=3
Run Code Online (Sandbox Code Playgroud)

我该如何处理这个案子呢?有没有一种方法不需要像在中那样解析命令行两次

parameters = parser.parse_args()
parameters_from_file = load_file(parameters.file)
parser.set_defaults(**parameters_from_file)
parameters = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

对我来说这看起来不像"明显的pythonic方式"吗?这是准读取可以指定为参数的配置文件,所以我希望有一个好方法.

Som*_*ude 5

假设您使用该argparse模块,则在添加参数时不要设置默认参数.然后属性将是None如果参数不存在,并且您可以检查它而不是两次解析参数:

parser.add_argument('--C'   , action='store', dest='C')
parser.add_argument('--file', action='store', dest='file')
# ...

args = parser.parse_args()
# ...

if args.C is None:
    # Argument `--C` not given on command line
    if args.file is not None:
        # Load the file, set `args.C` if the file contains the `C` option
        ...

if args.C is None:
    # `C` was neither specified on the command line argument given,
    # nor in the configuration file, set default value
    args.C = 3

print 'C =', args.C
Run Code Online (Sandbox Code Playgroud)