python中的综合函数

roo*_*oot 1 python function python-internals

在python中,我可以创建一个没有类语句的类:

MyClass = type('X', (object,), dict(a=1))
Run Code Online (Sandbox Code Playgroud)

有没有办法创建一个没有'def'的函数?多数民众赞成就是......

d={} # func from string
exec'''\
def synthetics(s):
    return s*s+1
''' in d

>>> d.keys()
['__builtins__', 'synthetics']
>>> d['synthetics']
<function synthetics at 0x00D09E70>
>>> foo = d['synthetics']
>>> foo(1)
2
Run Code Online (Sandbox Code Playgroud)

kin*_*all 6

从技术上讲,是的,这是可能的.与所有其他类型一样,函数的类型是该类型实例的构造函数:

FunctionType = type(lambda: 0)
help(FunctionType)
Run Code Online (Sandbox Code Playgroud)

从帮助中可以看出,您需要至少代码和全局变量.前者是编译的字节码对象; 后者是一本字典.

要创建代码对象,可以使用代码类型的构造函数:

CodeType = type((lambda: 0).func_code)
help(CodeType)
Run Code Online (Sandbox Code Playgroud)

帮助说这是"不适合胆小的人",这是真的.你需要将字节码和一堆其他东西传递给这个构造函数.因此,获取代码对象的最简单方法是从另一个函数或使用该compile()函数.但是,如果你能够很好地理解Python字节码,那么技术上可以完全合成地生成代码对象.(我在非常有限的基础上完成了这个,构造了用于装饰器的签名保留包装函数.)

PS - FunctionType并且CodeType也可通过types模块.