Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 向调用方命名空间添加动态类 问题_Python - Fatal编程技术网

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