能否用function()创建Python函数?如何为其添加函数体代码?
用类似创建类的方式生成函数可行吗?怎么加函数体?
首先直接给结论:你最初试的MyFunc = function("MyFunc", (), {})肯定不行——Python里没有全局的function类,而且就算用正确的函数类types.FunctionType,它的创建逻辑也和type生成类完全不一样,不能靠传空元组、空字典来生成。
为什么类能用type直接创建?
type是Python所有类的元类,调用它时传入的三个参数(类名、基类元组、属性字典)刚好对应类定义的核心要素,Python会自动帮你完成类的初始化,所以这种方式很直观。
函数的正确创建方式
函数是types.FunctionType的实例,但创建它必须提供代码对象——这是Python把函数体编译成的字节码结构,是函数能执行的核心,而不是像类那样传属性字典。FunctionType的基本调用格式是:
types.FunctionType(code_object, global_namespace, function_name=None, default_args=None, closure=None)
code_object:必填,函数体编译后的字节码对象global_namespace:必填,函数执行时使用的全局变量空间- 后面三个参数是可选的,分别控制函数名、默认参数、闭包逻辑
实操示例:手动创建函数
有两种常见方式生成代码对象,进而创建函数:
方式1:复用现有函数的代码对象
如果你有一个现成的函数,可以直接拿它的__code__属性来生成新函数:
import types # 先写一个模板函数 def temp(x): return x * 2 # 用temp的代码对象创建新函数MyFunc MyFunc = types.FunctionType(temp.__code__, globals(), 'MyFunc') print(MyFunc(5)) # 输出10
方式2:用compile编译字符串生成代码对象
如果你想从零构建函数体,可以把函数体代码写成字符串,用compile编译成代码对象:
import types # 编译函数体代码成代码对象,指定模式为'exec' code = compile('print("Hello!"); return 100', '<string>', 'exec') # 创建函数 MyFunc = types.FunctionType(code, globals(), 'MyFunc') result = MyFunc() # 输出Hello!,同时返回100 print(result) # 输出100
额外提醒
这种手动创建函数的方式几乎不会在日常开发中用到,def关键字或者lambda表达式简洁得多。只有在做一些元编程、动态代码生成的场景下,才需要用到types.FunctionType。
内容的提问来源于stack exchange,提问作者Arjun Ajesh
相关产品推荐
相关产品推荐

