2012-06-28 3 views
0

여기에 설명 할 복잡한 문제의 비트 :전역 변수를 사용하지 않고 너무 많은 인수를 전달하는 방법은 무엇입니까?

중간 값을 통해 한 입력을 다른 입력에 매핑하는 AB() 함수가 필요합니다. 더 구체적으로 함수는 두 가지 함수로 구성되어 있습니다. A()와 B()는 모두 사전 (A [B [입력]] 결과)을 반환합니다.

내 현재 파일 디렉토리 : 내 convert.py에서

packageX/ 

    __init__.py 
    get_part_of_B_expensively.py 
    something_that_will_use_convert.py 
    convert.py 
    packageA/ 

     __init__.py 
     get_the_entirety_of_A_expensively.py 

나는 다음과 같은 한 :

import get_part_of_B_expensively 
from packageA import get_the_entirety_of_A_expensively 
dict_A = packageA.get_the_entirety_of_A_expensively() 

def get_B(): 

    result = {} 
    result = get_part_of_B_expensively() # this is a very expensive operation 
    result += get_rest_of_B_inexpensively() # shorthand for adding two dictionaries 
    return result # returns a dictionary 

dict_B = get_B() # hence why i call it once outside, and not inside AB() 

def AB(input): 
    return dictA[dictB[input]] 

내가 get_B()를 정의하기 전에 dict_B를 초기화 할 수 없기 때문에이 적절하다고 생각하지 마십시오 하고, AB()의 유일한 매개 변수는 input이되고 싶습니다. 구현을 추상화하고 싶기 때문입니다. 그러나 전 세계적으로 몇 가지 변수를 소개합니다. 주로 dict_B와 dictA입니다. 이것이 최선의 방법인지는 확신 할 수 없습니다. get_B()를 자체 패키지로 분리 할 수는 있지만 전역 프레임에서 어딘가에 호출해야합니다. 이것에 대한 접근법이 무엇인지 잘 모르겠다. 나는 같은 패키지에있는 파일을 호출하는 A()와 B()를 최대한 자주 호출하지만 AB() 함수를 추상화하려고한다.

+0

당신의 유스 케이스는 무엇인가? 이것이 디자인이라고 생각하는 이유의 실제 예는 무엇입니까? –

+0

get_B()가 get_part_of_B_expensively.py 모듈에 속한 것처럼 보입니다. B를보다 효율적으로 얻는 방법에 대한 논리는 convert.py에 있으며 좋은 디자인이 아닐 수도 있습니다. – Salil

답변

3

이 모든 것이 모듈이 수행하는 것이라면, 그런 식으로 유지하는 것이 그리 어렵다고 나는 말하지 않을 것입니다. 특정 데이터를 조작하는 작은 스크립트의 경우, 특히 전역을 사용하는 것이 좋습니다. 특히 읽기 전용으로 사용하는 경우에 특히 그렇습니다. 전역 변수와 관련된 혼란스러운 문제는 변형하거나 재 바인딩해야 할 때 발생합니다. 구성 파일에서로드 된 사용자 지정 옵션 등 다양한 종류의 전역 매개 변수를 저장하는 전역 변수가있는 라이브러리가 많이 있습니다.

당신의 작업이 더 복잡 있다면 더 헤비급 상황 들어, 당신은 기본적으로이 수행하는 클래스를 만들 수 있습니다

class Convert(object): 
    def __init__(self): 
     self.A = packageA.get_the_entirety_of_A_expensively() 
     self.B = getB() # or put get_B's code in here 
    def AB(self, input): 
     return self.A[self.B[input]] 

converter = Convert() 
converter.AB('blah') 

당신이 한 일을해야하는 경우가 과잉 될 수 있지만,이 방법 작업을 매개 변수화해야하는 경우 (예 : 작동해야하는 A 및 B dicts가 여러 개있는 경우).

+0

이것은 나에게 좋은 접근 방법입니다. 클래스를 반드시 사용하고 싶지 않은 경우 함수에 대한 값을 속성 (http://stackoverflow.com/questions/338101/python-function-attributes-uses-and-abuses)으로 저장할 수도 있지만 객체 지향 접근법을 고수하는 편이 낫습니다. –

관련 문제