2010-01-31 1 views
3

방금 ​​아래의 쿼리를 comp.lang.python에 게시했지만이 종류의 질문은 여기에 어떤 종류의 권리가 있다고 생각합니다. 스택 오버플로도 반복되므로 반복하십시오. 본질 : 왜 'builtins'는 파이썬 3에서 두 가지 별개의 해석을합니까? 나는이 문장, http://celabs.com/python-3.1/reference/executionmodel.html에서 수집 무엇인지에 대한 논평을 받아 매우 기쁘게 될 것파이썬 3 (python 3.1, python 3k, python3000)에 내장 된 두 가지 상충되는 의미

는 가 의미하는 의미, 또는 신이 결정한 이유는 갈 방법입니다. 나는에 말을해야합니다 케이 Schluehr라는 이름의이 남자를 예상 , 또는 어쩌면 BDFL 그의 fallovers, 추종자, 그리고 fellownerds ::

 
    The built-in namespace associated with the execution of 
    a code block is actually found by looking up the name 
    __builtins__ in its global namespace; this should be a 
    dictionary or a module (in the latter case the module’s 
    dictionary is used). By default, when in the __main__ 
    module, __builtins__ is the built-in module builtins; 
    when in any other module, __builtins__ is an alias for 
    the dictionary of the builtins module itself. 
    __builtins__ can be set to a user-created dictionary to 
    create a weak form of restricted execution. 

은 사용에 __builtins__에게 올바른 방법을 발음하는 걱정됩니다 적어도 두 개의 서로 다른 용어 인 (단수)과 'builtins'(복수형), 중 일부가 모듈과 dict 형식으로 존재했는지 (그냥 추측 했습니까?). 지금 builtins 만 있으므로 다행히 사이의 양립성이 사라지고 좋은 복수가 있습니다.

하지만 (이것은 '스크립트'(이름이 존재 python foobar.py 호출이었다 즉 모듈)의 범위이다 여부에 따라 __builtins__ 변경의 의미를 수행하거나 여부 보조 모듈 범위 이유 직접 또는 간접적으로 가져 오거나 실행 한 경우 foobar.py)? 나는 이것의 뒤에 추론을 이해할 수없고 매우 혼란 스럽다.

근거 : 왜 내가 -i를 할 수 있도록하려면 상관이야에 'R이고 내가 exec(compile(get (locator), locator, 'exec'), R)를 통해 실행 파이썬 모듈 (밑줄 접두사로) 개인 표시되지 않은 전역 네임 스페이스로 내보내기 이름 상기 모듈의 개인 이름을 유지하기 위해 으로 가야한다. 그것 이다. 조금은 묘한 것이지만 기본 연습은 파이썬의 임포트 시스템을 우회하여 결과를 얻는 것이다. 모든 것을 global로, 그리고 module-global namespace에 이름을 주입하는 것이 전부다.

답변

1

getattr(__builtins__, '__dict__', __builtins__) 당신이 __builtins__이 딕셔너리인지, "글로벌 네임 스페이스로 내보내기 이름"을 업데이트 할 DICT를 제공해야합니다 (다음은 __dict__ 그렇게 getattr 반환에게 제 3 인수를 속성이 없습니다 dict __builtins__ 자체) 또는 모듈 (에 해당 속성이 있고 getattr이 반환합니다). 이것이 해결책입니다. 왜 파이썬은 그런 엉성한 해결 방법을 요구하는 방식으로 작동하는지 문서화하여, 사용자가 볼 수있는 (그리고 실제로 문서화 된) 수준 (한숨)으로 떠오르는 구현 문제의 불행한 사례로 분류 할 것입니다. 안타깝게도 Python 3로 옮겨 가면서 수정하지는 않았지만, 이제는 하위 호환되지 않는 변경 사항을 적용하기에는 너무 늦었습니다. (

+0

이 빠르고 간단하게 해결해 주셔서 감사합니다. 나를 찾고있는 비트. – flow