我有限的理解是,types.FunctionTypes(dict
)的第二个参数决定了函数代码的可用内容。我很好奇在内部实例化函数时如何决定它。为了说明我的意思,如果我尝试动态复制一个函数:
a = 'test'
def foo():
print(a)
bar = types.FunctionType(
foo.__code__,
globals(),
'bar',
foo.__defaults__,
foo.__closure__
)
这似乎与globals()一起工作正常,但我错过了什么吗?更令人困惑的是一种类方法。如果我做这样的事情:
a = 'test'
class Foo(object):
b = 'Foo prints this'
def myfunc():
print(a, self.b)
Bar = type('Bar', tuple(), dict())
Bar.b = 'Bar prints this'
ns = globals()
#should I do ns.update(something) here?
f = Foo.myfunc
Bar.myfunc = types.FunctionType(f.__code__, ns, 'myfunc', ...)
这个例子有效,但不是更复杂的一个:
import imp
import builtins
class Foo(object):
def __init__(self):
super().__init__() # super(Foo, self) also fails
mod = imp.new_module('test')
mod.__builtins__ = builtins
mod.Foo = type('Foo', tuple(), dict())
f = Foo.__init__
ns = {}
ns.update(mod.__dict__) #missing something here
mod.Foo.__init__ = types.FunctionTypes(f.__code__, ns, '__init__', ...)
有人可以说明ns
中的内容吗?什么是类方法可用,什么不可用?
我并没有特别试图让上面的代码工作,我更倾向于解释它为什么没有。
答案 0 :(得分:0)
问题似乎是“复制”__closure__
属性不会创建副本;这是函数体(def __init__
)本身被执行的执行上下文;支持python语言中的词法作用域规则。看一看:
>>> [cell.cell_contents for cell in f.__closure__]
[<class '__main__.Foo'>]
不出所料,它是它定义的类。除了使用cell
之外,我不确定创建新exec
对象的简单方法,以创建新的类和方法;您可以将新单元格复制到要添加到新类的其他方法中,但单元格和类都将是全新的。