2017-12-27 157 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中所有選項的相同效果。

相關問題