2015-01-27 1 views
-2

다른 모듈에서 함수를 가져 오려고하는데 모듈 이름을 목록에서 찾아야하기 때문에 import 키워드를 사용할 수 없습니다. Python이 지역 네임 스페이스를 검색하지 않습니다.

내가 ExampleFunc를 호출하려고하면

은 일반적으로 내가

NameError: global name 'ExampleFunc' is not defined 

얻을 수 있지만 명시 적으로 지역 주민에보고 파이썬을 말한다면 그것을 발견한다.

파일 module.py

def ExampleFunc(x): 
    print x 

파일 code.py

def imprt_frm(num,nam,scope): 
    for key, value in __import__(num,scope).__dict__.items(): 
     if key==nam: 
      scope[key]=value 

def imprt_nam(nam,scope): 
    imprt_frm("module",nam,scope) 

def MainFunc(ary): 
    imprt_nam("ExampleFunc",locals()) 

    #funtion things 

    return ExampleFunc(ary)    #fails 
    return locals()["ExampleFunc"](ary) #works 

MainFunc("some input") 
+0

중복 가능성 [. 지역 주민() 업데이트 (사전) 모든 변수를 추가하지 않습니다 (http://stackoverflow.com/questions/24197720/locals-updatedictionary-doesnt-add-all-the-variables) – bereal

답변

1

locals() 사전이지만 실제 주민 어레이의 반사. 그것을 통해 지역 주민에게 새 이름을 추가하거나 기존 지역을 변경할 수는 없습니다.

실제 프레임 소재지에서 필요에 따라 작성되는 사전이며 단방향입니다.

: 다음 locals() function documentation에서이 사전의 내용은 수정할 수 없습니다; 변경 사항은 인터프리터가 사용하는 로컬 및 프리 변수의 값에 영향을 미치지 않을 수 있습니다.

함수 로컬은 컴파일 타임에 고도로 최적화되고 결정되며, Python은 런타임시 알려진 지역을 동적으로 변경할 수 없습니다.

지역 주민이 직접 시도하는 것보다는 동적 가져 오기에서 하나의 개체를 반환 할 수 있습니다. 사용하여 importlib module 오히려 여기 __import__ 이상 :

import importlib 

def import_frm(module_name, name): 
    module = importlib.import_module(module_name) 
    return getattr(module, name) 

다음 단지 로컬 이름에 할당 :

def MainFunc(ary): 
    ExampleFunc = import_from('module' , 'ExampleFunc') 
    ExampleFunc(ary) 
+0

그렇다면 동일한 방식으로 globals()에 무언가를 추가 할 때 왜 작동합니까? – undeadherbs

+0

@undeadherbs : 왜냐하면'globals()'는 그런 반영이 아니기 때문입니다. 지역은 프레임에 대해 고도로 최적화되어 있습니다. –

+0

@undeadherbs 무엇이 로컬이고 어떤 것이 기능 컴파일 중에 정의되지 않은 것입니까? 동적으로 변경을 허용하면 최적화를 방해하고 다른 몇 가지 예기치 않은 사항을 허용합니다. – bereal

관련 문제