我有一个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方式"吗?这是准读取可以指定为参数的配置文件,所以我希望有一个好方法.
假设您使用该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)