阿小信大人的头像
Where there is a Python, there is a way. 阿小信大人

functools模块的使用2014-09-02 04:43

partial函数:

>>> int('1010') #默认参数base=10
1010
>>> int('1010', 10)
1010
>>> int('1010', base=10)
1010
>>> int('1010', 2)
10
>>> from functools import partial
>>> #partial重新绑定函数的可选参数,生成一个callable的partial对象
>>> int2 = partial(int, 2)
>>> int2('1010')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: an integer is required
>>> int2('1010', 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: int() takes at most 2 arguments (3 given)
>>> int2('1010', base=2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: int() takes at most 2 arguments (3 given)
>>> int2 = partial(int, base=2)
>>> int2('1010')
10
>>> int2('1010', 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: int() takes at most 2 arguments (3 given)
>>> int2('1010', 2=2)
  File "<stdin>", line 1
SyntaxError: keyword can't be an expression
>>> #应该绑定的是形式参数,<span>可选参数必须写出参数名</span>
>>> int2('1010', base=2)
10
>>> int2('1010', 8)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: int() takes at most 2 arguments (3 given)
>>> int2('1010', base=8)
520
>>> type(int2)
<type 'functools.partial'>

update_wrapper函数:被封装函数的namemoduledocdict都复制到封装函数去

wraps函数将update_wrapper也封装了。

#-*- coding: utf-8 -*-

def good_dream(fun):  
  def dream(*args, **kw):  
    return fun(*args, **kw) + ' 梦到你的梦,就是好梦。' 
  return dream

@good_dream 
def sleep():  
  '''要早睡,不减肥''' 
  return '做个什么梦好呢?希望自己今晚做个好梦~'

print sleep()  
print sleep.__doc__

print "\n --- update_wrappered --- \n"

from functools import update_wrapper  
def good_dream(fun):  
  def dream(*args, **kw):  
    return fun(*args, **kw) + ' 梦到你的梦,就是好梦。' 
  return update_wrapper(dream, fun)

@good_dream 
def sleep():  
  '''要早睡,不减肥''' 
  return '做个什么梦好呢?希望自己今晚做个好梦~'

print sleep()  
print sleep.__doc__


print "\n --- wrapsed --- \n"

from functools import wraps
def good_dream(fun):
  @wraps(fun)
  def dream(*args, **kw):  
    return fun(*args, **kw) + ' 梦到你的梦,就是好梦。' 
  return dream

@good_dream 
def sleep():  
  '''要早睡,不减肥''' 
  return '做个什么梦好呢?希望自己今晚做个好梦~'

print sleep()  
print sleep.__doc__

运行结果:

F:\Python\test>python -m cProfile funvtoolstest.py

做个什么梦好呢?希望自己今晚做个好梦~ 梦到你的梦,就是好梦。
None

--- update_wrappered ---

做个什么梦好呢?希望自己今晚做个好梦~ 梦到你的梦,就是好梦。
要早睡,不减肥

--- wrapsed ---

做个什么梦好呢?希望自己今晚做个好梦~ 梦到你的梦,就是好梦。
要早睡,不减肥
34 function calls in 0.010 CPU seconds

Ordered by: standard name

ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.010 0.010 <string>:1(<module>)
2 0.000 0.000 0.000 0.000 functools.py:17(update_wrapper)
1 0.000 0.000 0.000 0.000 functools.py:39(wraps)
1 0.000 0.000 0.000 0.000 funvtoolstest.py:19(good_dream)
1 0.000 0.000 0.000 0.000 funvtoolstest.py:20(dream)
1 0.000 0.000 0.000 0.000 funvtoolstest.py:24(sleep)
1 0.006 0.006 0.007 0.007 funvtoolstest.py:3(<module>)
1 0.000 0.000 0.000 0.000 funvtoolstest.py:3(good_dream)
1 0.000 0.000 0.000 0.000 funvtoolstest.py:36(good_dream)
1 0.000 0.000 0.000 0.000 funvtoolstest.py:37(dream)
1 0.000 0.000 0.000 0.000 funvtoolstest.py:4(dream)
1 0.000 0.000 0.000 0.000 funvtoolstest.py:42(sleep)
1 0.000 0.000 0.000 0.000 funvtoolstest.py:8(sleep)
1 0.003 0.003 0.010 0.010 {execfile}
10 0.000 0.000 0.000 0.000 {getattr}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
2 0.000 0.000 0.000 0.000 {method 'update' of 'dict' objects}
6 0.000 0.000 0.000 0.000 {setattr}

如果您觉得从我的分享中得到了帮助,并且希望我的博客持续发展下去,请点击支付宝捐赠,谢谢!

若非特别声明,文章均为阿小信的个人笔记,转载请注明出处。文章如有侵权内容,请联系我,我会及时删除。

#Python#  
分享到:
阅读[1140] 评论[0]

你可能也感兴趣的文章推荐

本文最近访客

网友54.*.*.54[弗吉尼亚州]2018-05-27 11:36
网友66.*.*.81[美国]2018-05-27 11:33
网友194.*.*.118[法国]2018-05-27 11:18
网友66.*.*.79[美国]2018-05-27 11:17

发表评论