2010-06-09 5 views
2

파이썬은 다음과 같은 가장 바른 네임 스페이스를 가지고 있습니다.파이썬 네임 스페이스가 빌트인과 글로벌 사이에 있습니까?

내장 -이 네임 스페이스는 전체 인터프리터와 인터프리터 인스턴스 내에서 실행되는 모든 스크립트에서 전역입니다.

전역 -이 네임 스페이스는 모듈 전체에서 전역으로, 즉 단일 파일에서 사용됩니다.

나는이 두 부분 사이에서 네임 스페이스를 찾고 있는데, 여기서 네임 스페이스는 메인 스크립트 내에서 선언 된 몇 가지 변수를 호출하는 모듈에 공유 할 수 있습니다. 예를 들어

, script.py :

import Log from Log 
import foo from foo 

log = Log() 
foo() 

foo.py :

내가 script.py 여러 번하고 각각의 경우에 전화를 걸 수 있으려면
def foo(): 
    log.Log('test') # I want this to refer to the callers log object 

, 모듈 수준을 노출 foo 메소드에 객체를 기록하십시오.

가능하다면 어떤 아이디어가 있습니까?

로그 객체를 전달하는 것은 그리 고통스럽지 않지만 Javascript에서 포팅 된 많은 양의 코드로 작업하고 있습니다. 또한 foo 호출자가 로그 객체를 노출하도록 제약 조건을 설정한다는 것을 이해합니다.

감사합니다, 폴

답변

4

는 내장 매크로와 전역 "사이"네임 스페이스가 없습니다 -하지만 당신은 쉽게 자신의 네임 스페이스를 만들 그래서 다른 모듈이 "수입"그들 (이상적으로 하지from ... import를 사용 할 수 sys.modules의 이름을 삽입 할 수 있습니다 문법, 문제의 부하를 운반하고 명확하게 문법 오류를 제공, 당신이 발명했습니다 import ... from 구문을 사용하지 않는). 예를 들어, script.py의 경우 :

import sys 
import types 
sys.modules['yay'] = types.ModuleType('yay') 

import Log 
import foo 

yay.log = Log.Log() 
foo.foo() 

import yay 

def foo(): 
    yay.log.Log('test') 

foo.py에서 자격을 갖춘 이름을 두려워하지 마십시오 - 그들은 선 (善)입니다! 또는 파이썬 (AKA import this)의 젠의 마지막 줄에 넣는다 :

Namespaces are one honking great idea -- let's do more of those! 

당신은하고 "그 이상"가장 간단하게 사용할 수 있습니다 - 다만 (적절한 그들을 얻으면, 당신의 이름 자격 namespace they 에 속해 있습니다!) 그냥 적합하지 않은 barenames를 고집하지 말고. 자격이되는 이름으로 아주 쉽게 bazillion 것들이 있고, 심각하게 문제가있는 것 사이에서 barenames에 달라 붙는 사람들을 위해 거의 불가능한 곳 어디에서든지 -)

+0

위대한 답변을 주셔서 감사합니다. – Paul

+0

이 기능을 가지고 놀고 나면, 모듈이 builtins와 동일한 네임 스페이스에서 공유되는 것처럼 보이기 때문에 찾고자하는 것이 아닙니다. 두 가지 스크립트를 동시에 실행하면 각 모듈이 만든 모듈의 내용이 바뀔 수 있습니다 .- ( 세계의 끝이 아니라 일련의 인터페이스를 업데이트해야합니다. 감사합니다. – Paul

+1

@Paul 물론, 모든 모듈은 다른 모든 모듈의 내용을 변경할 수 있습니다. 호출자가 선호하는 로그 객체를 참조하기 위해'yay.log' (어디에서 액세스했는지)를 원하면 호출자는' IOW, 인수를 전달하는 것은 이상한 방법입니다 (호출자가 지정한대로 '가져 오기'를 수행하도록 함으로 암시되는 원형 교차로가 아니라 인수 _를 전달하면 훨씬 명확 해집니다). –

0

는 그러한 범위가 없습니다. builtins 범위에 추가하거나 관련 객체를 전달해야합니다.

0

사실, 나는 내가 무엇을 찾고 있었는지 알아 냈다.

이 해킹은 실제로 PLY로 사용되며 그 곳을 우연히 발견합니다.

라이브러리 코드는 런타임 예외를 발생시켜 호출자 스택에 액세스 할 수 있습니다.

관련 문제