本篇文章给大家带来的内容是关于Python动态定义函数的方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

基于 MIT 许可协议

在 Python 中,没有可以在运行时简化函数定义的语法糖。然而,这并不意味着它就不可能,或者是难以实现。from types import FunctionType

foo_code = compile('def foo(): return "bar"', "", "exec")

foo_func = FunctionType(foo_code.co_consts[0], globals(), "foo")

print(foo_func())

输出:bar

剖析

逐行检视代码,你会发现语言/解释器的屏障是多么脆弱。>>> from types import FunctionType

Python 文档通常不会列出那些非用于手动创建的类的特征(这是完全合理的)。有三种方法可以解决这个问题:help()、inspect(无法查看内置方法)、以及最后的解决方案,即查看 CPython 源代码。(推荐:python教程)

在本例中,help() 与 inspect 都可以完成工作,但是查看实际的源代码,则会揭示出关于数据类型的更多细节。>>> from inspect import signature

>>> signature(FunctionType)

1. code

内部是一个PyCodeobject ,作为types.CodeType 对外开放。非内置方法拥有一个__code__ 属性,该属性保存了相应的代码对象。利用内置的 compile() 方法,可以在运行期创建types.CodeType 对象。

2. globals

如果一个函数引用的变量不是在局部定义的,而是作为参数转入、由默认参数值提供、或者通过闭包上下文提供,则它会在 globals 字典中查找。

内置的 globals() 方法会返回一个对当前模块的全局符号表(global symbol table)的引用 ,因此能被用来提供一个总是与当前表的状态相一致的字典。传入任意其它的字典也是可以的(FunctionType((lambda: bar).__code__, {"bar" : "baz"}, "foo")() == "baz")。

3. name(可选)

控制所返回的函数的__name__ 属性。只真正对 lambdas 有用(由于匿名性,它们通常没有名称),并且重命名函数。

4. argdefs(可选)

通过传入一个包含任意类型的对象的元组,提供了一个方式来供应默认参数值(def foo(bar="baz"))。(FunctionType((lambda bar: bar).__code__, {}, "foo", (10,))() == 10)。

5. closure(可选)

(如果需要在 CPython(PyPy,Jython,...)以外的其它 Python VM 中执行,可能不应该触及,因为它严重地依赖于实现细节)。

一个cell 对象的元组。创建 cell 对象并非完全是直截了当的,因为需要调用 CPython 的内部组件,但有一个库可以令它更加方便:exalt (无耻的广告)。(译注:这个库是作者开发的。)>>> foo_code = compile('def foo(): return "bar"', "", "exec")

compile() 是一个内置方法,因此同时也是文档丰富的。

exec 模式被用到,因为定义函数需要用多个语句。>>> foo_func = FunctionType(foo_code.co_consts[0], globals(), "foo")

聚合全部内容,并将动态创建的函数指定给一个变量。

那个被前一句代码编译成的函数,成为了生成的代码对象的第一个常量,因此仅仅指向 foo_code 是不充分的。这是 exec 模式的直接后果,因为生成的代码对象可以包含多个常量。>>> print(foo_func())

动态生成的函数可以像其它函数一样被调用。

最后

除了做实验,需要用到动态创建函数的场景很少。

玩耍(Toying around) Python 的内部构件是一种深入学习这门语言的好方法。

如果需要,可以毫不费力地越过解释器/语言的界线。

python 定义函数方法_Python动态定义函数的方法介绍相关推荐

  1. python调用函数示例_python 动态调用函数实例解析

    1. 根据字符串名称 动态调用 python文件内的方法eval("function_name")(参数) 2. 根据字符串 动态调用类中的静态方法,getattr(ClassNa ...

  2. python函数定义的要点_python基础之函数重点

    函数的返回值 现在有一个需求,比较两个人的月薪,然后想获取月薪较大人的年薪. 如果需要在程序中拿到函数的处理结果做进一步的处理,则需要函数必须要有返回值. 需要注意的是: return是一个函数结束的 ...

  3. python 获取方法名_python 动态获取当前运行的类名和函数名的方法

    一.使用内置方法和修饰器方法获取类名.函数名 python中获取函数名的情况分为内部.外部,从外部的情况好获取,使用指向函数的对象,然后用__name__属性 复制代码代码如下: def a():pa ...

  4. python中函数包括参数函数吗_Python中的函数---函数的定义和参数

    本文是廖雪峰教程的笔记. 函数的定义 定义函数时,需要确定函数名和参数个数 def fun(x1,x2,x3):: 如果有必要,可以先对参数的数据类型做检查: 函数体内部可以用return随时返回函数 ...

  5. python中def fun 定义函数列表_Python学习之 函数篇

    Python函数 函数就是完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给它取一个名字. 可以通过函数名在程序的不同地方多次执行(这通常叫函数调用). 函数定义要在函数调用之前,否则函数 ...

  6. python函数和模块的使用方法_Python学习06_函数和模块的使用

    引入 在写有些代码的时候,会发现有些步骤重复了多次,他也不像循环,都是相同的东西在重复,而是指做某件事情的步骤方法,做事的人或对象发生了改变,但是方法却没有改变. 要想写出高质量的代码,首先要解决的就 ...

  7. python编程内置函数使用方法_Python内置函数 next的具体使用方法

    Python 3中的File对象不支持next()方法. Python 3有一个内置函数next(),它通过调用其next ()方法从迭代器中检索下一个项目. 如果给定了默认值,则在迭代器耗尽返回此默 ...

  8. python定义一个数组_Python数组定义方法

    本文实例讲述了Python数组定义方法.分享给大家供大家参考,具体如下: Python中没有数组的数据结构,但列表很像数组,如: a=[0,1,2] 这时:a[0]=0, a[1]=1, a[[2]= ...

  9. python内置函数及方法_python 内置函数 应用及方法

    一.主要内容: 1.内置函数 什么是内置函数? 就是python给你提供的. 拿来直接⽤的函数, 比如print., input等等. 截⽌ 到python版本3.6.2 python⼀共提供了68个 ...

最新文章

  1. 张萍萍 计科高职13-1 201303014010 实践三结对项目
  2. Linux C编程--网络编程3--面向无连接的网络编程
  3. 数据结构32:树存储结构
  4. XCTF-Reverse:logmein
  5. python将html存为pdf_用Python将HTML转为PDF。
  6. 工作按钮(216):点击按钮报错--bug修复--直接写接口里面
  7. 电子计算机时代 英语,2018年英语专四作文范文:计算机时代
  8. (06)Vivado约束基础
  9. CSS样式布局入门介绍,非常详尽
  10. 单片机代码真值怎么取反c语言,手把手教你学单片机的C语言程序设计(八)运算符与表达式(续).pdf...
  11. 联想7400打印机如何与手机连到一起_激光打印机与喷墨打印机,哪个使用成本更低?...
  12. 学习PS2无线手柄解码通讯手册
  13. 读博不怎么花家里的钱,为什么还说穷人不要读博
  14. 双侧检验的p值和单侧检验_t检验的时候怎么区分是单侧检验还是双侧呢?
  15. 远程访问内网服务器使用FRP实现内网穿透
  16. c 语言从指针得到对象,c – 获取指向由智能指针指向的对象的指针 – Ivalue错误...
  17. 初中生物课堂中提升学生核心素养的有效策略
  18. 一个优酷会员账号可以登录几台设备
  19. 【Spring实战】----Security4.1.3鉴权之美--基于投票的AccessDecisionManager实现及源码分析
  20. 科技型中小企业评价入库好处有哪些

热门文章

  1. 后台原理_从浏览器如何进入路由器后台【详细介绍】
  2. 目标跟踪:CamShift算法
  3. VTK修炼之道16:图像处理_窗口分割和图像融合(ViewportvtkImageBlend)
  4. bash-shell高级编程--操作符与相关主题
  5. 通过init进程看如何启动第一个应用程序
  6. BUUCTF-WEB:[极客大挑战 2019]Havefun 1
  7. 逆向工具之IDA的使用
  8. JAVA——Map基础知识
  9. 逆序输出(数组练习)
  10. Altium Designer -- PCB布线面试题(转)