python函数使用方法高级用法(Python骚操作之动态定义函数)
python函数使用方法高级用法
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" ) print (foo_func()) |
输出:bar
剖析
逐行检视代码,你会发现语言/解释器的屏障是多么脆弱。
|
>>> from types import functiontype |
python 文档通常不会列出那些非用于手动创建的类的特征(这是完全合理的)。有三种方法可以解决这个问题:help()、inspect(无法查看内置方法)、以及最后的解决方案,即查看 cpython 源代码。
在本例中,help() 与 inspect 都可以完成工作,但是查看实际的源代码,则会揭示出关于数据类型的更多细节。
|
>>> from inspect import signature >>> signature(functiontype) <signature (code, globals , name = none, argdefs = none, closure = none)> |
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"' , "<string>" , "exec" ) |
compile() 是一个内置方法,因此同时也是文档丰富的。
exec 模式被用到,因为定义函数需用多个语句。
|
>>> foo_func = functiontype(foo_code.co_consts[ 0 ], globals (), "foo" ) |
聚合全部内容,并将动态创建的函数指定给一个变量。
那个被前一句代码编译成的函数,成为了生成的代码对象的第一个常量,因此仅仅指向 foo_code 是不充分的。这是 exec 模式的直接后果,因为生成的代码对象可以包含多个常量。
|
>>> print (foo_func()) |
动态生成的函数可以像其它函数一样被调用。
结尾
除了做实验,需要用到动态创建函数的场景很少。
玩耍(toying around) python 的内部构件是一种深入学习这门语言的好方法。
如果需要,可以毫不费力地越过解释器/语言的界线。
还是一如既往地:不要滥用语言 (好吧,一点点也无妨,对吧?)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。
原文链接:https://mp.weixin.qq.com/s/o-HuE3VxgHedfe8X5fUrMA
- python人脸识别库(python3人脸识别的两种方法)
- python怎么去掉字符串的空格(Python切片操作去除字符串首尾的空格)
- 如何查看python是否安装selenium(selenium+python截图不成功的解决方法)
- python将网站图片本地存储(详解Python下载图片并保存本地的两种方式)
- python学生管理系统与数据库(python学生管理系统学习笔记)
- python生成效果图(python如何制作缩略图)
- python获取字符串类型(python3利用ctypes传入一个字符串类型的列表方法)
- opencv提取图像轮廓python代码(Python基于opencv调用摄像头获取个人图片的实现方法)
- python参模块使用教程(Python参数解析模块sys、getopt、argparse使用与对比分析)
- python和mysql实战(由Python编写的MySQL管理工具代码实例)
- python一分钟认识条件判断(对python判断ip是否可达的实例详解)
- pythonyield使用场景(Yii框架核心组件类实例详解)
- python爬虫爬取网页信息教程(python爬虫爬取微博评论案例详解)
- python爬取数据总结(python3爬虫学习之数据存储txt的案例详解)
- python实现栈和队列(Python利用heapq实现一个优先级队列的方法)
- python中dict怎么创建(Python数据类型之Dict字典实例详解)
- 被骂欺师灭祖,与郭德纲公开叫板,何云伟改名何沄伟,开始画画了(与郭德纲公开叫板)
- 相声转行影帝,被何晴抛弃,甩10年女友闪婚生子,刘威不靠谱情史(相声转行影帝被何晴抛弃)
- 岳云鹏不说相声,改行演员了 网友 快回来说相声(岳云鹏不说相声)
- 乔欣首演古装大女主,颜值演技双在线(乔欣首演古装大女主)
- 于正又推女性古装大剧 杨蓉乔欣演女配,两位女主成 重头戏(于正又推女性古装大剧)
- 乔欣古装女主戏获热度 作为女主,却没吃到红利(乔欣古装女主戏获热度)
热门推荐
- dockernginx服务器教程(Docker镜像+nginx 部署 vue 项目的方法)
- phpstudy使用教程(phpstudy是什么)
- python基于django的博客系统(利用django+wechat-python-sdk 创建微信服务器接入的方法)
- js三级联动列表(基于JavaScript实现年月日三级联动)
- python字典的key(Python使用dict.fromkeys快速生成一个字典示例)
- mysql图形化管理工具
- vmware配置桥接(VMware虚拟机桥接方式实现上网互通的方法)
- php框架laravel使用(laravel5环境隐藏index.php后缀apache的方法)
- 怎样在python中散点图(python使用Plotly绘图工具绘制散点图、线形图)
- 虚拟主机是搭建网站吗(电商网站选择虚拟主机的教程)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9