2013-09-03 2 views
1

두 개의 스크립트, script1 및 script2가 있다고 가정 해보십시오.수입 및 오류에 대해 혼동 -

script1이는 다음과 같이 정의된다 :

class Foo(object): 
    def __init__(self, name): 
     self.name = name 

class bar(object): 
    def __init__(self, name): 
     self.name = name 

def test(givenString): 
    return eval(givenString) 

및 script2는 다음과 같이 정의된다 :

from .script1 import test 

x = "Foo('me')" 
print test(x) 

test(x)에 대한 script2의 인쇄 문이 성공적으로 나는 Foo 개체가 있음을 알려줍니다,하지만하지 않습니다 왜냐하면 나는 Foo이 아닌만을 script1에서 가져 왔기 때문입니다. eval 설명서를 살펴 봤지만 그 점이 나에게별로 도움이되지 못했습니다. Foo 클래스를 가져 오지 않은 경우에도 Foo 개체가 생성되는 것은 어떻게 가능합니까?

+0

C 배경이 있고'import '가 include 문처럼 작동하고'mymodule import myfunction에서 from'이 일종의 조건부 include처럼 작동하는 것이 궁금합니다. –

+0

@StevenRumbalski 나는 C의 약간을했지만, C 배경이 있다고는 말할 수 없습니다. –

답변

5

eval()testscript1 글로벌 네임 스페이스의 삶. '이 실행되는 모듈의 전역 변수를 사용하므로, eval() 의해 실행되는 임의의 표현은 Foo, bartest를 해결할 수있는, 따라서 그 기능과 같은 공간을 사용.

함수를 가져 오면 해당 네임 스페이스가 변경되지 않습니다. test의 전역 변수는 script2에서 호출하여 변경되지 않습니다. 그렇다면 script1의 수입액은 이고 수입액은 script2으로 가져올 필요가 있습니다. 그것은 믿을 수 없을 정도로 비실용적입니다.

가져온 기능의 전역을 볼 수도 있습니다. print test.func_globals은 정확한 네임 스페이스 script1을 표시합니다.

+0

아마도'exec'도 비슷하게 작동할까요? –

+0

@EdgarAroutiounian : 예,'exec'는 똑같이 작동합니다. –

+0

Martijn Pieters 그런 다음 동일한 스크립트에 정의 된 각 함수는 동일한'func_globals dict'을 포함합니까? 그런 종류의 중복되지 않습니다? –

관련 문제