Python 动态创建函数【转】

知乎上也有相似的问题

偶然碰到一个问题,初想是通过动态创建Python函数的方式来解决,于是调研了动态创建Python函数的方法。

定义lambda函数

在Python中定义lambda函数的写法很简单,

func = lambda: "foobar"

可以认为lambda函数是最常用的一种方式。

定义局部函数

Python中函数可以在代码块中进行定义,比如decorator就是通过这种方式实现的,

def decorator(func):
    def _(*args, **kwargs):
        return func(*args, **kwargs)
    return _

通过types.FunctionType创建函数

Python标准库中的types.FunctionType也可以用于创建函数,常见有如下两种使用方式,

  • 从已有函数构建心函数
def foobar():
    return "foobar"

dynamic = types.FunctionType(foobar.__code__, {})
  • 配合compile函数构建
module_code = compile(‘def foobar(): return "foobar"‘, ‘‘, ‘exec‘)
function_code = [c for c in module_code.co_consts if isinstance(c, types.CodeType)][0]
foobar = types.FunctionType(function_code, {})
print foobar()

通过ast创建函数

除了通过compile()直接编译字符串代码之外,Python中也可以直接创建ast相关对象,最终再通过compile(), types.FunctionType进行构建,

from ast import *
import types

function_ast = FunctionDef(
    name=‘foobar‘,
    args=arguments(args=[], vararg=None, kwarg=None, defaults=[]),
    body=[Return(value=Num(n=42, lineno=1, col_offset=0), lineno=1, col_offset=0)],
    decorator_list=[],
    lineno=1,
    col_offset=0
)
module_ast = Module(body=[function_ast])
module_code = compile(module_ast, "<>", "exec")
function_code = [c for c in module_code.co_consts if isinstance(c, types.CodeType)][0]
foobar = types.FunctionType(function_code, {})
print foobar()

通过eval创建函数

最后还有一个eval函数,

foobar = eval(‘lambda: "foobar"‘)

在eval函数中不能直接通过def定义函数,所以尝试定义lambda函数进行替代。

其它方法

除了上面罗列的还有些旁的方法,比如,

将函数定义写入到单独的py文件中,而后通过 __import__ 操作导入模块来获取定义的函数。

总结

绝大部分应用场景下通过lambda或decorator就足以应付需求了,不过动态语言的函数就是真的想动态的搞,也是能找到方法的。

原文:http://soliloquize.org/2015/07/02/Python动态创建函数的几种方法/

时间: 2024-10-06 22:43:21

Python 动态创建函数【转】的相关文章

python动态修改函数名

困惑 在之前用sgmllib解析网页的时候遇到了·def do_a(self,attr)·这类的函数,可以自动识别<a>并解析其中内容. 在看learningpythonthehardway时也遇到了render.index()之类的随着url路由而变化的函数名. 遂思考,怎么才能实现这种动态的函数名呢? 研究 在使用Java.C.C#等其他语言时,并没有这类的功能.有可能是python独有功能,遂百度,未发现相关介绍. python为动态语言,且为面向对象语言,一切为对象.函数也是一个对象,

python动态创建类的声明

动态创建类的声明 使用内置函数type,原型:class type(name, bases, dict)name是类的名字,相当于__class__bases是类的基类,元组,可以有多个基类,但是基类必须直接或者间接继承自object类,否则会报错dict是类的变量,字典类型,相当于静态变量,与在__init__函数中声明的不同 代码示意片段: class A(object): def __init__(self): print "A init ..." class B(A): def

Python(2):创建函数模块

说明: 在使用python的时候我们除了使用内置的函数之外,可能还需要使用一些别人写的函数.或者我们写的代码也希望可以给其他人使用.要实现这样的功能,我们就需要按照下面的步骤来定义自己的模块: Step1:新建一个py文件 首先我们将前面一章所写的打印列表的函数保存为一个.py文件,假设我这里保存为 kider.py. 1 """ 2 这是一个打印列表的函数,如果列表中有嵌套的列表也会展开打印出来 3 """ 4 def print_list(m

python 动态调用函数

1. 根据字符串名称 动态调用 python文件内的方法eval("function_name")(参数) 2. 根据字符串 动态调用类中的静态方法,getattr(ClassName,"function_name")(参数) 3. apply(functoin_name,parameters)  这个function_name不是字符串,而是函数对象本身:parameters是参数,类似(a,b,...)这样的格式 4. 当函数不确定参数的数目时候,采用 一个 *

[python]动态创建类

本文主要说明如何使用type来创建类,并添加类属性.方法. type实则是python内建元类,用来创建 类,当我们用class 定义一个类时,python后台是在用type创建该类. 了解type的两种用法 class type(object) | type(object) -> the object's type | type(name, bases, dict) -> a new type 创建A类,具有A.addr属性 >>> A = type('A', (), {'

python动态调用函数

callmap = {ts.get_stock_basics: 'D:/dxw/code/all.csv', ts.get_sz50s: 'D:/dxw/code/50.csv', ts.get_hs300s: 'D:/dxw/code/300.csv', ts.get_zz500s: 'D:/dxw/code/500.csv'} def updatecode(): # 更新全部 index = 0 for callfunc in callmap.keys(): df = callfunc()

Python骚操作:动态定义函数

在 Python 中,没有可以在运行时简化函数定义的语法糖.然而,这并不意味着它就不可能,或者是难以实现. from types import FunctionType foo_code = compile('def foo(): return "bar"', "<string>", "exec") foo_func = FunctionType(foo_code.co_consts[0], globals(), "foo&

Python中动态创建类实例

Python中动态创建类实例 简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模块.如下: def createInstance(module_name, class_name, *args, **kwargs): module_meta = __import__(module_name, globals(), locals(), [class_n

javascript学习笔记(四):事件处理函数和动态创建html标记。

1 HTML的事件属性  全局事件属性:HTML 4 增加了使事件在浏览器中触发动作的能力,比如当用户点击元素时启动 JavaScript. a. Window 事件属性,针对 window 对象触发的事件(应用到 <body> 标签),常用的为onload. b. Form事件,由 HTML 表单内的动作触发的事件(应用到几乎所有 HTML 元素,但最常用在 form 元素中):常用的为onblur.onfocus.onselect.onsubmit. c. keybord事件 d.Mous