2017-12-27 50 views
0

개발의 편의를 위해 코드를 하드 코딩 된 argparse 구성으로 사용합니다.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 

    .... 

옵션을 사용하여 의견을 달아 쉽게 켜거나 끌 수 있습니다. 스크립트를 실행하려면

, 나는 하드 구성을 무시하는 프로그램에게 옵션을 사용합니다 여기

python main.py --from_bash --loglevel 3

--from_bash을 나는 잊지 경우는, 버그 경향이있다 - from_bash 옵션을 잘못 선택했습니다.

하드 코딩 된 구성과 명령 줄 사이를 전환하는 더 깨끗한 방법이 있습니까?

+0

사용자가 3 개의 값,'local_conf','argparse' 디폴트 값, 그리고 사용자 제공 값 중에서 선택해야하는 것처럼 보입니다. 'argparse' 디폴트가 정말로 필요합니까? – hpaulj

답변

0

당신은 예컨대 local_conf 값을 조건 + 기본 값을 지정할 수 있습니다 : --loglevel가 지정되지 않은

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을 사용합니다. 플래그를 사용하는 경우 (argparse의 action="store_true") 당신이 True 또는 False로 기본 설정하려는 경우 결정해야

그래서 인수없이 실행, 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 
... 

이제 개발자는 하드 코딩 된 구성에 대해 알아야합니다. 아웃 - 오브 - 박스 방식에 대한


, 당신은 파일에서 구성을 읽을 수있는 argparse 기능을 사용할 수 있습니다.

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

그런 다음이 구성이 @로 시작 제공 할 수 있습니다 :

당신은 마법의 단어 파서의 인스턴스를

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

이 구성 파일을 읽을 수 있도록 : 그것은 당 라인 하나 개의 값이됩니다

python main.py @configurations.txt 

이렇게하면 configurations.txt의 모든 옵션을 명령 줄에 지정했을 때와 동일한 효과를 얻을 수 있습니다.