내가 가져 오는 모듈에 변수를 추가하는 방법은 무엇입니까?
문제
내가하고 싶은 것은 다음과 같습니다.
template.py
def dummy_func():
print(VAR)
# more functions like this to follow
fabfile.py
# this gets called by fabric (fabfile.org)
# safe to think of it as ant build.xml
import template
template.VAR = 'some_val'
from template import *
즉, 다른 모듈에는 필요한 변수를 기여하는 템플릿 모듈이 있습니다. 이것은 (대상 상속과는 달리) 기능적 방식으로 수행 할 수 있습니까?
편집 : 조금 더 많은 코드가 추가되었습니다.
해결책
"기능적 방식"이 무엇을 의미하는지 잘 모르겠습니다. 기능적 프로그래밍? 그것은 발생하지 않을 것입니다 (본질적으로 FP의 반대 인 객체를 수정하려고합니다). 아니면 "작동하는 방식"과 같은 것을 의미합니까?
후자의 해석의 경우 큰 문제는 import *
부분 - 그것을 사용하지 않는 것이 제안하는 많은 문제 중에서, 당신은 하나로 눌러질 것입니다 : 그것은 다음을 수행합니다. 스냅 사진 당시에는 모든 모듈 수준의 이름 (또는 나열된 이름 만 __all__
모듈에서 정의 된 경우) - 이름의 바인딩에 대한 향후 변경 사항은 이전에했던 모듈에 결코 반영되지 않습니다. import *
.
왜 합병해야한다고 믿습니까? template_module
가져 오기 모듈의 네임 스페이스에 대한 네임 스페이스? 방금 정기적으로 한 경우 import template_module as tm
, 그런 다음 모든 관련 이름을 다음과 같이 언급합니다. tm.this
, tm.that
잘 작동합니다 (사용의 순간까지 바인딩에 대한 모든 변경 사항을 선택하는 것을 포함하여, 즉, 여기에서 필요한 것으로 보이는 "늦은 바인딩"접근법을 사용합니다).
다른 팁
한 곳에서 모듈의 속성을 변경하면 다른 장소에서도 동일합니다. 증거:
'/tmp/test1.py'파일 작성 :
imoprt os
os.path = '' # set os.path (module) to a mere string
os.zzz = 'zzz'
그 다음에
cd /tmp && python
>>> dir(test)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'os', 'z']
>>> test.os
<module 'os' from '/usr/lib/python2.6/os.pyc'>
>>> test.os.path
''
>>> import os
>>> os.path
''
>>> os.zzz
'zzz'
이제 OS.Path는 기본 응용 프로그램에서도 빈 문자열이며 ZZZ도 어디에나 있습니다.
이것은 직물 중심 솔루션이 있습니다.
그래서 당신은 초록이 있습니다 some__fab__template.py 그리고 콘크리트 fabfile.py 필요한 변수 (예 : 프로젝트 이름)를 기고하는 템플릿을 '확장'해야합니다.
나는 Fab 's를 사용하여 구현했습니다 env 사전.
템플릿 파일에서 참조하십시오 env.VAR
그리고 '콘크리트'에서 fabfile.py 당신은 이것을합니다 :
from fabric.api import *
env.VAR = 'some value'
import some__fab__template
def dist():
some__fab__template.dist()