검사 다음의 임원 또는 execfile를 통해이 스크립트를 실행하려고 할 때파이썬 메타 클래스, execfile, 그것은 예상대로 작동, 전역(), 네임 스페이스
import inspect
__module__ = "__main__"
__file__ = "classes.py"
test_str = "test"
class met(type):
def __init__(cls, name, bases, dct):
setattr(cls, "source", inspect.getsource(cls))
#setattr(cls, "source", test_str)
super(met, cls).__init__(name, bases, dct)
class ParentModel(object):
__metaclass__ = met
def __init__(self):
super(object, self).__init__(ParentModel.__class__)
def setsource(self):
self.source = inspect.getsource(self.__class__)
#self.source = test_str
def getsource(self):
return self.source
class ChildB(ParentModel):
name = "childb"
pass
class ChildA(ChildB):
name = "childa"
pass
class ChildC(ChildA):
name = "childc"
pass
어려움이 발생 파이썬 셸 또는 다른 스크립트. 그러나 문제없이
>>> execfile("classes.py")
실행 : 예를 들어
>>> ns = {}
>>> execfile("classes.py", ns)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "classes.py", line 13, in <module>
class ParentModel(object):
File "classes.py", line 9, in __init__
setattr(cls, "source", inspect.getsource(cls))
File "D:\Python27\lib\inspect.py", line 701, in getsource
lines, lnum = getsourcelines(object)
File "D:\Python27\lib\inspect.py", line 690, in getsourcelines
lines, lnum = findsource(object)
File "D:\Python27\lib\inspect.py", line 526, in findsource
file = getfile(object)
File "D:\Python27\lib\inspect.py", line 408, in getfile
raise TypeError('{!r} is a built-in class'.format(object))
TypeError: <module '__builtin__' (built-in)> is a built-in class
이 주어진 사전을 혼동하는 오류, 결과는 execfile의 글로벌 네임 스페이스 인수에 대해 허용됩니다. 그러나 : 다시
>>> execfile("classes.py", globals())
하지만, 문제없이 실행 : 역 추적에서
>>> ns = dict(globals())
>>> execfile("classes.py", ns)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "classes.py", line 13, in <module>
class ParentModel(object):
File "classes.py", line 9, in __init__
setattr(cls, "source", inspect.getsource(cls))
File "D:\Python27\lib\inspect.py", line 701, in getsource
lines, lnum = getsourcelines(object)
File "D:\Python27\lib\inspect.py", line 690, in getsourcelines
lines, lnum = findsource(object)
File "D:\Python27\lib\inspect.py", line 526, in findsource
file = getfile(object)
File "D:\Python27\lib\inspect.py", line 408, in getfile
raise TypeError('{!r} is a built-in class'.format(object))
TypeError: <module '__builtin__' (built-in)> is a built-in class
, 그것의, 그러나 그것은 ("classes.py") 또는 execfile execfile에 오류가한다 검사 관련 (" classes.py ", globals())도 사용할 수 있습니다.
이 오류와 관련하여 dict (globals())! = globals()가 어떻게 발생하며이 오류가 발생하는 이유는 무엇입니까?
편집 : 독자는 Martijn Pieters와 Lennart Regebro의 답변을 참조하여 전체 그림을 찾아야합니다.
사실, 그렇지 않습니다. 두 번째 파일을 만들고'execfile ('classes.py', globals())를 호출하면 에러가 발생합니다. –
@ LenartRegebro : 나는 해답을 이미 수정했다. –
죄송합니다, Martijn, 나는 틀렸다고 생각합니다. 문제는 그것이 실행 된 네임 스페이스가 클래스 모듈의'globals()'가 아닐 때이다. 이것은 인터프리터에서 실행하거나 execfile하고 네임 스페이스를 전달할 때 발생합니다. 그러나 네임 스페이스를 전달하지 않으면 작동합니다. –