2014-12-16 1 views
2

디렉토리를 입력으로 사용하는 스크립트를 작성하고 있습니다. 이 디렉토리는 디스크의 데이터를 읽는 많은 다른 기능에 사용됩니다. 현재 디렉토리 이름을 사용하는 각 함수 또는 클래스를 통해 전달되는 변수에 저장되어 그것을 :Python : 프로그램의 구성 변수를 설정하는 방법은 무엇입니까?

data_dir = get_data_dir() 
spam = calculate_spam(foo, bar, data_directory=data_dir) 
eggs = calculate_eggs(spam, baz, data_directory=data_dir) 

불행하게도, 함수 서명과 함수 호출에 불필요하게 하드 코드를 만드는, 매우 길어질 따라서 오류가 발생하기 쉽습니다. 이와 같은 구성 매개 변수를 처리하는 더 나은 (즉 Pythonic) 방법이 있습니까?

+0

[config] (https://docs.python.org/3.4/library/configparser.html) 파일에이 파일을 넣고 그 confing 객체 나 그 일부를 전달할 수 있습니다. myconf.py와 같은 단일 모듈을 구성 매개 변수로 사용할 수도 있습니다. – Marcin

답변

0

각 기능에 대한 단일 목록 매개 변수를 만들면 쉽게 사용할 수 있습니다.

2

당신은 많은 필수 인수를 공유하는 기능의 무리가있는 경우 :

foo(x, y, z, alpha) 
bar(x, y, z, beta) 
baz(x, y, z, gamma) 

그것은 x, yz 사전에 속하거나 함께 namedtuple 있다는 신호가 될 수 있습니다. 이 라우트를 따라 명명 된 터플로 함께 구성된 구성 부분을 배치 할 수 있습니다. 그러나 일반적으로 정확히 을 필요한 것으로 정확히을 함수로 넘길뿐입니다. 따라서 함수가 하나의 항목을 사용하기 위해 많은 구성 매개 변수를 사용하여 사전을 가져 간다면 잘못된 디자인의 징후 일 수 있습니다.

심지어 감각 x, y 및 클래스 z, 그리고 foo, barbaz 방법을 넣어 만들 수 있습니다

class XYZ: 

    def __init__(self, x, y, z): 
     ... 

    def foo(self, alpha): 
     ... 

    def bar(self, beta): 
     ... 

    def baz(self, gamma): 
     ... 

구성은 다음 클래스의 상태의 일부가됩니다.

한편, 긴 인수 목록은 함수가 필요로하는 것보다 많은 것을 나타내는 기호 일 수 있습니다. 귀하의 기능을 고려하십시오 calculate_spam(foo, bar, data_dir). 아마도이 함수는 디렉토리에서 일부 데이터를로드하고 일부 데이터를 계산합니다. 로딩과 컴퓨팅을 데이터를로드하는 load_spam(data_dir)과 같은 두 가지 별도의 함수로 분리하는 것이 더 합리적일까요? 그렇다면 calculate_spam(data, ...)을 계산 하시겠습니까?

너무 많은 인수가있을 때 함수를 더 작은 조각으로 분할해야하는 경우가 종종 있습니다. 그것은 법이 아니지만 엄지 손가락으로 나를 위해 많은 시간을 할애합니다.

+0

맞습니다.이 기능은 여러 가지 일을하는 것처럼 보입니다. 실제 코드에서는 로딩과 계산이 두 함수로 구분됩니다. 호출되는 상위 레벨 함수는 모든 것을 관리합니다 (위의 예에서 함수 이름이 잘못 선택됨). 차라리 일종의 전역 변수에서 구성을 숨기는 방법을 찾고 있습니다. 'logging' 패키지와 마찬가지로, 처음에 설정 한 다음 명시 적으로 전달하지 않고 모든 곳에서 사용할 수 있습니다. – ThS

관련 문제