2012-07-26 8 views
1

optparse에서 선택적 인수를 전달하는 방법을 알아 내려고하고 있습니다. 내가 가진 문제는 optparse 옵션을 지정하지 않으면 None 유형으로 기본 설정되지만, None 유형을 함수에 전달하면 기본값 (이해할 수 있고 유효 함) 대신 나에게 소리가납니다. 내가 선택적 인수에 대한 함수의 기본값을 사용하지만 if 문의 거대한 숫자를하지 않고 입력이있는 경우 여전히 사용자 입력을 전달 어떻게 질문은optparse에서 선택적 인수 전달

conn = psycopg2.connect(database=options.db, hostname=options.hostname, port=options.port) 

.

답변

2

무의미한 인수에 대해 사전을 필터링하는 함수 remove_none_values을 정의하십시오.

def remove_none_values(d): 
    return dict((k,v) for (k,v) in d.iteritems() if not v is None) 

kwargs = { 
    'database': options.db, 
    'hostname': options.hostname, 
    ... 
} 
conn = psycopg2.connect(**remove_none_values(kwargs)) 

또는 원본 함수의 데이터를 전달하기 전에 없음 값을 제거하는 기능 래퍼를 정의한다.

def ignore_none_valued_kwargs(f): 
    @functools.wraps(f) 
    def wrapper(*args, **kwargs): 
     newkwargs = dict((k,v) for (k,v) in d.iteritems() if not v is None) 
     return f(*args, **kwargs) 
    return wrapper 

my_connect = ignore_none_valued_kwargs(psycopg2) 
conn = my_connect(database=options.db, hostname=options.hostname, port=options.port) 
+0

감사합니다, 속임수를 썼는지 :

는 코드입니다. 나는 dict를 만들고 None 유형을 제거하는 것보다 덜 해킹 된 방법이 있었으면 좋겠다. – Kyo

0

thebops 패키지 (pip install thebops, https://bitbucket.org/therp/thebops)의 opo 모듈은 add_optval_option 기능을 포함한다. 이 옵션은 옵션없이 값을 사용하는 경우 사용할 값을 지정하는 추가 키워드 인수 empty을 사용합니다. 옵션 문자열 중 하나가 명령 행에서 발견되면,이 값은 인수 목록에 삽입됩니다.

이 여전히 hackish하지만, 적어도 그것은 사용이 간편한 기능을 만든 ...

그것은 다음과 같은 상황에서 잘 작동은 :

  • 인수 벡터는 이미 때 존재 옵션이 생성됩니다. 이것은 대개 사실입니다. 옵션 값 스포츠 인수가 주어진 값이 필요 내가 찾은
  • 모든 프로그램은 --option=value 또는 -ovalue보다는 --option value 또는 -o value로 첨부합니다.

어쩌면 empty 인수를 지원하기 위해 thebops.optparse을 조정할 것입니다. 하지만 회귀를 피하기 위해 먼저 테스트 스위트를 갖고 싶습니다. 원래는 Optik/optparse 테스트를 사용하는 것이 좋습니다.

from sys import argv 
def add_optval_option(pog, *args, **kwargs): 
    """ 
    Add an option which can be specified without a value; 
    in this case, the value (if given) must be contained 
    in the same argument as seen by the shell, 
    i.e.: 

    --option=VALUE, --option will work; 
    --option VALUE will *not* work 

    Arguments: 
    pog -- parser or group 
    empty -- the value to use when used without a value 

    Note: 
     If you specify a short option string as well, the syntax given by the 
     help will be wrong; -oVALUE will be supported, -o VALUE will not! 
     Thus it might be wise to create a separate option for the short 
     option strings (in a "hidden" group which isn't added to the parser after 
     being populated) and just mention it in the help string. 
    """ 
    if 'empty' in kwargs: 
     empty_val = kwargs.pop('empty') 
     # in this case it's a good idea to have a <default> value; this can be 
     # given by another option with the same <dest>, though 
     for i in range(1, len(argv)): 
      a = argv[i] 
      if a == '--': 
       break 
      if a in args: 
       argv.insert(i+1, empty_val) 
       break 
    pog.add_option(*args, **kwargs)