前言
types.FunctionType 创建函数有2种方式:
- 从已有函数的基础上,创建一个新函数
- 从一个compile 构建的函数对象上,创建一个新函数
FunctionType 使用
FunctionType 可以用于判断一个对象是不是函数
from types import FunctionType, MethodType
def func():
print("hello")
class Demo:
x = 1
def fun(self):
print(self.x)
@staticmethod
def fun2():
print("f2")
print(type(func)) # <class 'function'>
x = Demo()
print(type(x.fun)) # <class 'method'>
print(type(x.fun2)) # <class 'function'>
# 判断是函数还是方法
print(isinstance(func, FunctionType)) # True
print(isinstance(x.fun, MethodType)) # True
print(isinstance(x.fun2, FunctionType)) # True
创建新函数
从已有函数的基础上,创建一个新函数
5个参数
- code是函数体的code对象
- globals就是当前环境下的globals变量
- name就是函数本身的名字
- argdefs保存了函数的默认参数,这里可以注意到,code里只包含函数执行的逻辑,而默认参数则是在函数声明里
- closure是闭包的变量,换句话说是既不在locals里,也不在globals的变量
import types
def foobar():
return "foobar"
dynamic_fun = types.FunctionType(foobar.__code__, {})
print(dynamic_fun()) # foobar
配合compile函数 创建函数
使用示例
import types
f = """
def foobar():
return "foobar"
"""
# 字符串编译成code
module_code = compile(f, '', 'exec')
# 从编译的code obj 取出CodeType 类型
function_code = module_code.co_consts[0]
foobar = types.FunctionType(function_code, {})
print(foobar())
FunctionType 需传一个CodeType 类型,可以从compile() 函数编译后的code取出编译后的code 类型
如果通过一个函数创建更多的函数,可以参考这篇https://zhuanlan.zhihu.com/p/386276353
参考博客https://www.cnblogs.com/fireblackman/p/16192027.html
参考博客https://www.cnblogs.com/olivetree123/p/5067685.html