2017-12-27 127 views
0

为了便于开发,我在代码中使用硬编码参数配置在harcoded配置和命令行之间切换使用argparse

import argparse 

if __name__ == '__main__': 
    local_conf = { 
     "debug": True, 
     "loglevel": 2 
    } 

    parser = argparse.ArgumentParser() 
    parser.add_argument("--from_bash", action="store_true") 
    parser.add_argument("--debug", action="store_true") 
    parser.add_argument("--loglevel", default=5) 
    conf =parser.parse_args() 

    if not conf.from_bash: 
     conf.__dict__ = {**conf.__dict__, **local_conf} # merges configurations 

    .... 

我发现通过对它们进行评论可以更轻松地打开和关闭选项。

从脚本执行它,我用一个选项告诉程序忽略硬编码的配置:--from_bash这里

python main.py --from_bash --loglevel 3

这是错误容易,如果我忘记了 - from_bash选项,我得到一个错误的配置。

在硬编码配置和命令行之间切换是否有更简洁的方法?

+0

看起来您的用户需要从3个值中选择'local_conf','argparse'默认值和用户提供的值。你真的需要这些'argparse'默认值吗? – hpaulj

回答

0

可以在e.g的local_conf值指定条件+默认值:

import argparse 

if __name__ == '__main__': 
    parser = argparse.ArgumentParser() 
    parser.add_argument("--debug", action="store_true") 
    parser.add_argument("--loglevel") 
    conf = parser.parse_args() 
    default_level = 2 
    local_conf = { 
     "debug": conf.debug, # This will be False on absence of --debug 
     "loglevel": conf.loglevel if conf.loglevel else default_level 
    } 

    print(local_conf) 

例如,这将使用2作为默认级别,除非指定--loglevel。当使用标志(argparse的action="store_true"),你需要决定是否要默认为TrueFalse

因此,没有ARGS运行此,local_conf会打印:

{“调试”:假,“日志级别':2}

使用--loglevel 5 --debug

{' 调试': true,'loglevel':'5'}

+0

是的,尝试过,但它放弃了在argparse初始化中设置默认值的可能性,最后我发现它更糟糕。感谢这个想法 – bold

1

这里有两种选择。


你把用户的心理负荷增加--from_bash时,他们希望自己的配置服从。需要一个特殊的标志可能会更有意义,因此硬编码配置只能与标志一起使用。

... 
parser = argparse.ArgumentParser() 
parser.add_argument("--dev", action="store_true", help=argparse.SUPPRESS) # Don't show in help message... user doesn't need to know 
... 

if conf.dev: 
    conf.__dict__ = {**conf.__dict__, **local_conf} # merges configurations 
... 

现在,只有您作为开发人员需要了解有关硬编码配置的任何信息。


对于出的现成的方法,你可以使用​​从文件中读取配置能力。它需要一个值每行:

# Contents of configurations.txt 
--debug 
--loglevel 
2 

您与魔法的话实例化您的解析器能够读取配置文件:

parser = argparse.ArgumentParser(fromfile_prefix_chars='@') 

您可以提供这种配置前缀@

python main.py @configurations.txt 

这会在命令行中给出configurations.txt中所有选项的相同效果。

相关问题