Python 向调用方命名空间添加动态类 问题
无法在函数中动态创建具有本地作用域的类,但可以在顶级工作 问题: 如何在正确的命名空间范围内动态创建类Python 向调用方命名空间添加动态类 问题,python,Python,无法在函数中动态创建具有本地作用域的类,但可以在顶级工作 问题: 如何在正确的命名空间范围内动态创建类 我试图动态创建添加到调用方命名空间的类 这样我就能做到以下几点 import creator creator.make('SomeClass') print "SomeClass :", SomeClass 当在顶层添加动态类时,这可以起作用,但是当尝试在函数中执行相同操作时,这样创建的类只有局部作用域,它就不起作用了 我看到有一个放在函数中可以工作,但它会消失 下面的代码显示了这个问题,
我试图动态创建添加到调用方命名空间的类 这样我就能做到以下几点
import creator
creator.make('SomeClass')
print "SomeClass :", SomeClass
当在顶层添加动态类时,这可以起作用,但是当尝试在函数中执行相同操作时,这样创建的类只有局部作用域,它就不起作用了
我看到有一个放在函数中可以工作,但它会消失
下面的代码显示了这个问题,显然,creator.py
的问题比上面显示的要多
# creator.py
import inspect
def make(classname):
t = type(classname, (object,), { })
frame = inspect.currentframe()
print "WILL make() - callers locals :", frame.f_back.f_locals.keys()
frame.f_back.f_locals[classname] = t
print "DID make() - callers locals :", frame.f_back.f_locals.keys()
return t
输出:
WILL __main__ - locals : ['creator', '__builtins__', '__file__', '__package__', '__name__', '__doc__']
WILL make() - callers locals : ['creator', '__builtins__', '__file__', '__package__', '__name__', '__doc__']
DID make() - callers locals : ['creator', '__builtins__', 'SomeClass', '__file__', '__package__', '__name__', '__doc__']
DID __main__ - locals : ['creator', '__builtins__', 'SomeClass', '__file__', '__package__', '__name__', '__doc__']
SomeClass : <class 'creator.SomeClass'>
--------------------------------------------------------------------------------
WILL closed() - locals : ['ClosedClass']
WILL make() - callers locals : ['ClosedClass']
DID make() - callers locals : ['ClosedClass', 'AnotherClass']
DID closed() - locals : ['ClosedClass', 'AnotherClass']
OUCH: global name 'AnotherClass' is not defined
WILL\uuuuu main\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
WILL make()-调用者局部变量:['creator','uuuuu内置项','uuuu文件','uuuuu包','uuuuu名称','uuuu文档']
DID make()-调用者局部变量:['creator','uuuuu内置项','SomeClass','uuuu文件','uuuu包','uuuu名称','uuuu文档']
DID uuu main uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
某类:
--------------------------------------------------------------------------------
WILL closed()-locals:['ClosedClass']
将使()调用方成为本地人:['ClosedClass']
DID make()-调用方本地:['ClosedClass','AnotherClass']
DID closed()-局部变量:['ClosedClass','AnotherClass']
哎哟:未定义全局名称“AnotherClass”
当然我不想要哎哟:…
查看locals()
中的closed
可以想象它应该可以工作,但是正如在hack中提到的,Python编译器正在优化局部变量,而没有引入新的动态局部变量
如果我取消注释exec'
行,它就会工作
我可以用全局范围创建这些类,但我正在努力保持名称空间的干净
我当然可以做AnotherClass=creator.make('AnotherClass')
,但我正在努力保持干燥
有没有办法让它在没有exec'
hack的情况下工作
还是要让它们全球化?不。访问局部变量的唯一方法是通过或vars()
,在这两种情况下,文档都明确指出,不能保证对dict
返回的修改会影响局部变量,因此:无法可靠地做到这一点
如果您希望静态修改局部变量,那么您可能可以修改与函数关联的代码对象以提供更多的局部变量,但这可能不可能,或者很难可靠地完成,我认为没有理由这样做
WILL __main__ - locals : ['creator', '__builtins__', '__file__', '__package__', '__name__', '__doc__']
WILL make() - callers locals : ['creator', '__builtins__', '__file__', '__package__', '__name__', '__doc__']
DID make() - callers locals : ['creator', '__builtins__', 'SomeClass', '__file__', '__package__', '__name__', '__doc__']
DID __main__ - locals : ['creator', '__builtins__', 'SomeClass', '__file__', '__package__', '__name__', '__doc__']
SomeClass : <class 'creator.SomeClass'>
--------------------------------------------------------------------------------
WILL closed() - locals : ['ClosedClass']
WILL make() - callers locals : ['ClosedClass']
DID make() - callers locals : ['ClosedClass', 'AnotherClass']
DID closed() - locals : ['ClosedClass', 'AnotherClass']
OUCH: global name 'AnotherClass' is not defined