gpt4 book ai didi

python - Python 中可能存在真正的动态和匿名函数吗?

转载 作者:太空宇宙 更新时间:2023-11-03 19:55:49 25 4
gpt4 key购买 nike

正如可以使用 type(name、base-classes、namespace-dict) 创建动态类一样,可以创建动态函数吗?

我尝试过做一些事情:

>>> f = type("f", (function,), {})
NameError: name 'function' is not defined

好吧,我会变得聪明,但是:

>>> def fn():
... pass
...
>>> type(fn)
<type 'function'>
>>> f = type("f", (type(fn),), {})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: type 'function' is not an acceptable base type

Python 是否像允许动态类一样专门阻止动态函数的创建?

编辑:注意,我不允许使用 exec 。因为我的问题是 Python 语言本身是否允许这样做。

提前致谢。

最佳答案

types.FunctionType,您可以使用它来动态创建函数,例如

def test_func(): print 'wow' 
dynf = types.FunctionType(test_func.func_code, {})
dynf()

输出:

wow

您可能会反对说这不是动态的,因为我正在使用另一个函数的代码,但这只是一个例子,有一种方法可以从 python 字符串生成代码,例如

dynf = types.FunctionType(compile('print "really WoW"', 'dyn.py', 'exec'), {})
dynf()

输出:

really WoW

现在这是动态的!

OP 担心此类函数的动态特性,因此这是另一个示例

dynf = types.FunctionType(compile('test_func():\ntest_func()', 'dyn.py', 'exec'), globals())
dynf()

输出:

wow
wow

注意:像这样创建 Function 对象似乎有局限性,例如传递参数并不容易,因为传递参数需要将正确的co_argcount、co_varnames等12个变量传递给types.CodeType,理论上可以做到,但容易出错,是一种更简单的方法是将字符串作为模块导入,并且您拥有完整的功能,例如

import types
import sys,imp

code = """def f(a,b,c):
print a+b+c, "really WoW"
"""
module = imp.new_module('myfunctions')
exec code in module.__dict__
module.f('W', 'o', 'W')

输出:

WoW really WoW

关于python - Python 中可能存在真正的动态和匿名函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59547132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com