내가 가져 오는 모듈에 변수를 추가하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1902656

  •  19-09-2019
  •  | 
  •  

문제

내가하고 싶은 것은 다음과 같습니다.

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()
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top