1

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

MyClass = type('X', (object,), dict(a=1))

有没有办法创建一个没有'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
4

2 回答 2

6

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

FunctionType = type(lambda: 0)
help(FunctionType)

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

要制作代码对象,您可以使用代码类型的构造函数:

CodeType = type((lambda: 0).func_code)
help(CodeType)

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

PS——FunctionTypeCodeType可以通过types模块获得。

于 2012-09-20T13:20:54.403 回答
2

可能有比以下更直接的方法,但这里有一个没有def. 首先,使用一个简单的lambda表达式来获取一个函数对象:

>>> func = lambda: None

然后,compile一些源代码获取代码对象并使用它来替换lambda's 代码:

>>> func.__code__ = compile("print('Hello, world!')", "<no file>", "exec")
>>> func()
Hello, world!
于 2012-09-20T13:12:40.963 回答