2017-05-19 7 views
0

Python 3.6에서 Argh를 사용하여 복잡한 명령 줄 함수를 만들었지 만 깊은 구성 파일로 인해 함수에서 인수의 기본값을 가져 오는 것은 긴 사전 키 문자열을 사용합니다.함수 인자로 슈퍼 긴 사전을 어떻게 작성 하는가?

다른 사전의 키로 사전 값이 있기 때문에 특히 읽기 쉽지 않습니다. 보다 더 중첩 될 수 있습니다.

이와 같은 기본값을 가진 인수가 더 많을 수 있으므로이를 유지하는 것이 훨씬 더 혼란 스러울 것입니다. 이것은 단지 하나의 기본 인수하고 예 :

import argh 
import config 

@arg('-v', '--version') 
def generate(
    kind, 
    version=config.template[config.data['default']['template']]['default']['version']): 
    return ['RETURN.', kind, version] 

버전 인수 기본값 목록과 사전 형식으로 많은 양의 데이터를 생성 내 설정 모듈에서 검색됩니다. 시도하고 더 나은 기본값 설명하기 :

config.template[ # dictionary containing variables for a particular template 
    config.data['default']['template'] # the default template name set in the main configuration 
]['default']['version'] # The default version variable within that particular template 

은 무엇이 더 읽기를 유지하는 당신이 권장합니까를?

+1

아마, 당신은 [easydict] 같은 뭔가를 찾고있어 (https://pypi.python.org/pypi/easydict/) 또는 [ treedict] (http://www.stat.washington.edu/~hoytak/code/treedict/overview.html) (또는 동일한 아이디어의 무수한 다른 변형)? – drdaeman

답변

1

변경 가능한 기본값에 사용 된 것과 동일한 트릭을 사용하고 싶습니다. 이렇게하면 좀 더 읽기 쉬운 것을 쓸 여지가 생깁니다.

@arg('-v', '--version') 
def generate(kind, version=None): 
    if version is None: 
     d = config.data['default']['template'] 
     version = config.template[d]['default']['version'] 
    return ['RETURN.', kind, version] 

한가지 단점은 config.data (또는 임의 dicts) 내의 데이터가 함수가 정의 될 때와 그것이 실행될 때 사이 변경할 수 있기 때문에 이것이 techinically 다른 점이다. 함수를 정의하기 전에 사전 검토를 한 번만 수행하여이를 완화 할 수 있습니다.

# Choose whatever refactoring looks good to you 
default_template = config.data['default']['template'] 
default_version = config.template[default_template]['default']['version'] 

@arg('-v', '--version') 
def generate(kind, version=default_version): 
    return ['RETURN.', kind, version] 

del default_template default_version # Optional 
+0

필자는 _addict_ Python 라이브러리를 찾았으며 함수에 따라 이러한 리팩토링 중 하나 또는 둘 모두를 적용하는 것을 고려할 것입니다. –

1

이유는 한 줄에 그것을 할 :

default_template_id = config.data['default']['template'] 
default_template = config.template[default_template_id] 
default_version = default_template['default']['version'] 

def generate(kind, version=default_version): 
    return ['RETURN.', kind, version]