2009-12-14 3 views
1

내가하고 싶은 일은 다음과 같다.내가 가져온 모듈에 변수를 추가하는 방법?

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 * 

즉, 템플릿 모듈을 다른 모듈이 필요한 변수에 기여하도록 '확장'해야한다. 이 기능을 (개체 상속과 반대되는) 기능적 방식으로 수행 할 수 있습니까?

편집 : 조금 더 많은 코드가 추가되었습니다.

+0

내가이 일을 적절한 방법이 무엇인지 모르겠지만, 같은 종류의를 사용하고있다 "VAR = value"를 template_module.py에 추가하면됩니다. – Kimvais

+1

"smth"는 무엇을 의미합니까? –

+0

@ S.Lott : "무언가". – AKX

답변

4

"기능적 방식"이 무슨 뜻인지 잘 모르겠습니다. functional programming과 같은 뜻입니까? FP의 반대 인 객체를 본질적으로 수정하려고하기 때문에 그럴 일은 없을 것입니다. 아니면 "일하는 방식"과 같은 것을 의미합니까?

후자의 해석

, 큰 문제는 import * 부분은 - 하나에, 당신은 헤로인 실행 거라고 사용하지 않는 것이 좋습니다 많은 문제들 : 그것은 어떤 모듈 수준의 스냅 샷을 수행 모듈의 이름이 바인딩되어있는 경우 (또는 모듈에있는 __all__에 나열된 모듈 만) - 이름 바인딩에 대한 이후의 변경 사항은 이전에 import *을 수행 한 모듈에는 반영되지 않습니다.

template_module의 네임 스페이스를 가져 오는 모듈의 네임 스페이스에 병합해야한다고 생각하십니까? 방금 import template_module as tm이라는 정규 번호를 입력했다면 모든 관련 이름을 tm.this, tm.that으로 간단하게 나타낼 수 있습니다 (사용 순간까지의 모든 변경 사항을 픽업하는 것 포함) - 즉 "늦게 사용합니다 바인딩 "접근법).

+0

@Alex Martelli는 세부 정보를 제공해 주셔서 감사합니다.나는 기본적으로 모든 필요한 세부 사항을 제공하는 템플릿을 '확장'하기위한 빌드 스크립트를 원합니다. '대상'호출을 복제하는 것은 약간 지저분 할 것 같지만 갈 길이 멀 것 같습니다. – yanchenko

0

한 곳에서 모듈의 속성을 변경하면 다른 곳에서도 동일하게 나타납니다. 증명 :

하는 파일 '/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' 

는 ZZZ는 지금을 os.path에도 기본 응용 프로그램에서 빈 문자열이되고, 도처에.

+0

X 가져 오기 Y에서 사용할 때 숫자, 튜플 또는 문자열과 같은 변경 불가능한 객체에서는 작동하지 않습니다. os.path = "foo"; os import path에서 가져온 것. os.path = "bar"; path -> 'foo' – AKX

+0

예,이 방법은 os.path에 대한 참조가되며, 변경하면 ** 로컬 ** "경로"가 변경됩니다. 그것은 os.path가 불변 된 것이 아닙니다. –

0

이 사실을 알기 위해서는 패브릭 중심 솔루션이 필요합니다.
따라서 일부 필수 변수 (예 : 프로젝트 이름)를 제공하는 템플릿을 '확장'해야하는 추상 some__fab__template.py과 구체적인 fabfile.py이 있습니다.
fab의 env 사전을 사용하여 구현했습니다. 템플릿 파일에서
당신은 env.VAR을 참조하고 fabfile.py '콘크리트'에서이 작업을 수행 :

from fabric.api import * 
env.VAR = 'some value' 
import some__fab__template 

def dist(): 
    some__fab__template.dist() 
관련 문제