2015-01-22 3 views
3

:함수에서 "from ... import *"가 허용되지 않는 이유는 무엇입니까? <a href="https://docs.python.org/3/reference/simple_stmts.html#the-import-statement" rel="nofollow">the documentation</a>에서

수입의 와일드 카드 양식 - from module import *은 - 오직 모듈 수준에서 허용됩니다. 클래스 또는 함수 정의에서이를 사용하려고하면 SyntaxError가 발생합니다.

왜? 함수에서 그것을 사용하는 것을 피하는 감각은 무엇입니까? 뭐가 문제 야?

답변

8

CPython 구현은 로컬 변수에 대한 특수 최적화를 사용합니다. 사전은 전역 에서처럼 동적으로 참조되지 않지만 에서 인덱스를 정적으로 할당하고 컴파일 할 때이고 인덱스로 룩업됩니다 런타임에는 훨씬 빠릅니다. 컴파일 할 때 파이썬 컴파일러가 모든 로컬 이름을 식별 할 수 있어야합니다. 함수 레벨에서 와일드 카드 가져 오기가 있으면 불가능합니다.

파이썬 2에서는 정적으로 모든 로컬 이름을 결정할 수없는 경우에도 대체 메커니즘이 호출되었습니다. 이 메커니즘은 로컬 변수에 대한 동적 사전을 사용하여 실행 속도를 크게 떨어 뜨립니다. 예를 들어

이 코드를 파이썬이 예상대로

def f(): 
    exec "x = 2" 
    print x 

작품, 파이썬 그래서 3

+0

에서 NameError에서

def f(): exec("x = 2") print(x) 

결과는 내가 그것을 권리를 얻고 경우 반면 방법 : 컴파일 시간에 로컬 스코프에 대해 파이썬은 사용 된 모든 변수를 찾아 테이블에 저장합니다. 전역 변수 대신 Python은 런타임에 모든 전역 이름을 포함하는 사전을 수정합니다. 함수에서 우리는 파이썬 정적 메커니즘을 사용하기 때문에 와일드 카드를 사용할 수 없다. 함수에서 가져온 모든 모듈과 그 모듈에서 가져온 모듈을 찾아서 컴파일해야하기 때문이다. 그게 맞습니까? – zer0uno

+0

@antox : 예, 그렇습니다. 전역 변수는 동적이므로 런타임에 동적으로 생성 될 수도 있습니다. 'globals()'사전을 수정하거나'exec()'를 사용함으로써, 가져올 수있는 모든 이름을 정적으로 결정하는 것은 절대 불가능합니다. –

+0

@sven_marnach 좋아, 한가지 질문. 당신은 파이썬 2에서 두 가지 메커니즘, 첫 번째 정적 및 두 번째 동적을 폴백으로 사용한다고 말했죠. 그들은 일종의 이런 행동을 전역에도 사용할 수 없었을까요? 왜냐하면 '정적으로'는 프로그램을 최적화하여 정적 전략을 사용한다는 것을 이해하지만, exec ("x = 2")를하고 싶다면 엔진이 두 번째 전략으로 돌아갑니다. – zer0uno

관련 문제