首页 > 编程语言 >python笔记76-types.FunctionType 动态创建函数

python笔记76-types.FunctionType 动态创建函数

时间:2022-11-18 12:58:38浏览次数:78  
标签:code 函数 python foobar 动态创建 76 print FunctionType types

前言

types.FunctionType 创建函数有2种方式:

  1. 从已有函数的基础上,创建一个新函数
  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

标签:code,函数,python,foobar,动态创建,76,print,FunctionType,types
From: https://www.cnblogs.com/yoyoketang/p/16902826.html

相关文章

  • Python算法题库(入门)
    1. 字符串最后一个单词长度str=input("输入一串字符串:")strList=str.split('')[-1]print(len(strList)) 2. 计算某字符出现的次数str=input("请输入:").......
  • 使用Python批量对文本文件编码互转
    在Windows下写C语言默认是GB2312,放到Linux上就会乱码,因为Linux和MacOS默认是UTF-8,因此写了个Python小脚本对指定路径下的文件进行转换。fromsysimportargvimportosf......
  • Python-统计执行时间
    方法一:importdatetimeimporttimestarttime=datetime.datetime.now()print(starttime.strftime("%Y-%m-%d%H:%M:%S"))time.sleep(2)endtime=datetime.datet......
  • Python - typing 模块
    typing模块的作用类型检查,防止运行时出现参数和返回值类型不符合。作为开发文档附加说明,方便使用者调用时传入和返回参数类型。该模块加入后并不会影响程序的运行,不会......
  • python 增删改查sqlserver
    importpymssql#打开数据库连接db=pymssql.connect(server='localhost',user='sa',password='888888',database='customerdb')#创建游标对象,并设置返回数据的类型为......
  • python模块 - copy模块
    copy模块用于对象的拷贝操作。该模块只提供了两个主要的方法:copy.copy与copy.deepcopy,分别表示浅复制与深复制。b=a.copy():浅拷贝,a和b是一个独立的对象,但他......
  • python-日志详解
    一.logging模块_打印以及保存日志1、Logging:用来做简单的日志。等级分为debug()、info()、warning()、error()和critical()等级 使用场景DEBUG 调试......
  • Python print() 实时打印
    在程序中发现print内容输出和实际输出时间不一致,所以怀疑输出时间有问题,实践发现print没有进行实时刷新。#正常使用print("something。。。")#实时刷新print("someth......
  • Python | Python中 from __future__ import * 的作用
    我们在读代码的时候,总是会看到代码开头会加上from__future__import*这样的语句。这样的做法的作用就是将新版本的特性引进当前版本中,也就是说我们可以在当前版本使用新......
  • python单线程爬虫安装与调试
    信息时代的到来,带给我们海量信息的同时也给我们带来很多有用的价值。如何在这些海量信息池里面找到自己需要的有价值的信息就离不开爬虫技术了,那么在python下如果去部署安装......