You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:55:04