python一个问题,有关闭包

zjpixyniannian 2008-07-11 05:05:47
#!/usr/bin/env python

from time import time

def logged(when):
def log(f, *args, **kargs):
print """Called:
function: %s
args: %r
kargs: %r""" % (f, args, kargs)

def pre_logged(f):
def wrapper(*args, **kargs):
log(f, *args, **kargs)
return f(*args, **kargs)
return wrapper

def post_logged(f):
def wrapper(*args, **kargs):
now = time()
try:
return f(*args, **kargs) ###为什么这里hello函数的参数变成了2个?
finally:
log(f, *args, **kargs)
print " time delta: %s" % (time()-now)
return wrapper

try:
return {"pre": pre_logged,
"post": post_logged}[when]
except KeyError, e:
raise ValueError(e), 'must be "pre" or "post"'

@logged("post")
def hello(name):
print "Hello,", name

hello("World!")

============================================================
谁能解释一下??
...全文
182 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
eudemon_cn 2008-09-26
  • 打赏
  • 举报
回复
谢谢,学习了~
maplele20 2008-09-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 eudemon_cn 的回复:]
**是乘方
[/Quote]

*和**是可变参数的两种不同表现形式,一种以列表存储参数,一种以字典存储。
eudemon_cn 2008-09-26
  • 打赏
  • 举报
回复
**是乘方
maplele20 2008-09-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tpfly 的回复:]
这不是装饰函数的问题,
看看 *args,**kwargs两个参数什么意思就知道了。

def a(word):
 print word

def wrapper(*args,**kwargs):
 a(*args,**kwargs)

wrapper('World')
调用wrapper,会把自己的参数传递给a,不论参数是多少个,也不论什么形式。
[/Quote]


>>> def a(word):
... print word
...
>>> def test(*args, **kargs):
... print 'args:', args
... print 'kargs:', kargs
... a(*args, **kargs)
...
>>> test('a', 'b', a='a', b='b')
args: ('a', 'b')
kargs: {'a': 'a', 'b': 'b'}
Traceback (most recent call last):
File "<interactive input>", line 1, in ?
File "<interactive input>", line 4, in test
TypeError: a() takes exactly 1 non-keyword argument (2 given)
>>>
wsliulao5 2008-09-21
  • 打赏
  • 举报
回复
楼上正解
tpfly 2008-07-12
  • 打赏
  • 举报
回复
这不是装饰函数的问题,
看看 *args,**kwargs两个参数什么意思就知道了。

def a(word):
 print word

def wrapper(*args,**kwargs):
 a(*args,**kwargs)

wrapper('World')
调用wrapper,会把自己的参数传递给a,不论参数是多少个,也不论什么形式。
iambic 2008-07-11
  • 打赏
  • 举报
回复
代码太复杂了。
等你把代码简化的时候,应该就是找到原因的时候了。

37,742

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧