VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • 一步步教你理解Python装饰器(5)

当我们定义一个函数时我们可以用**kwargs表明所有未捕获的keyword变量应该被存储在一个名为kwargs的字典中。前面的例子中的args和本例中的kwargs都不是Python语法的一部分,但是在函数定义时使用这两个作为变量名时一种惯例。就像一样,我们可以在函数调用时使用\*。

1
2
3
4
5
>>> dct = {'x': 1, 'y': 2}
>>> def bar(x, y):
...     rturn x + y
>>> bar(**dct)
3

 

12、更通用的装饰器(More generic decorators)

用我们掌握的新“武器”我们可以写一个decorator用来“记录”函数的参数。为了简单起见,我们将其打印在stdout上:

1
2
3
4
5
>>> def logger(func):
...     def inner(*args, **kwargs): # 1
...     print "Arguments were: %s, %s" % (args, kwargs)
...     return func(*args, **kwargs) # 2
... return inner

注意到在#1处inner函数带有任意数量的任何类型的参数,然后在#2处将它们传递到被包装的函数中。这允许我们包装或者装饰任何函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> @logger
... def foo1(x, y=1):
...     return x * y
>>> @logger
... def foo2():
...     return 2
>>> foo1(5, 4)
Arguments were: (5, 4), {}
20
>>> foo1(1)
Arguments were: (1,), {}
1
>>> foo2()
Arguments were: (),{}
2

对函数的调用会产生一个"logging"输出行,也会输出一个如我们期望的函数返回值。

 

如果你一直跟到了最后一个实例,祝贺你,你已经理解了decorators了!


相关教程