免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2683 | 回复: 0
打印 上一主题 下一主题

解析partial函数的实现 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-25 17:37 |只看该作者 |倒序浏览

定位到Python Standard Library的6.6节,  即6.6 functools,
看这样一个函数:
def partial(func, *args, **keywords):
        def newfunc(*fargs, **fkeywords):
            newkeywords = keywords.copy()
            newkeywords.update(fkeywords)
            return func(*(args + fargs), **newkeywords)
        newfunc.func = func
        newfunc.args = args
        newfunc.keywords = keywords
        return newfunc

我们可以这样调用:
binary_to_int = partial(int, radix=16)
print hex_to_int('11111111')
从模式的角度看, partial是一个functor adapter!

为什么可以做到这一点?我们来看看partial的代码实现.
partial做了3件事情:
1. 定义newfunc函数
2. 保存func, args, 以及keywords
3. 返回newfunc函数

binary_to_int = partial(int, radix=16), 对于这样一个语句,
我们发现当partial返回newfunc给binary_to_int后, 传递给partial
的参数对于new_func已经不可见, 那么当binary_to_int被调用时,
newfunc中的args, keywords, func从哪里来呢?
答案是: 来自于binary_to_int自身! 因为binary_to_int保存了func, args, keywords.
这说明了两个问题: 1. newfunc是一个函数对象, 定义了3个属性; 2. 当定义
一个函数时, 编译器不检查函数体中涉及的变量的有效性, 而是等到实际调用
时进行check; 3. Python是名副其实的动态语言
# e.g
def test(arg):
def func():
  print arg
func.arg = arg
return func


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/35936/showart_346647.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP