<core python>中一个程序的问题

<core python>中一个程序的问题

#!/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)         ###这里f函数,也就是hello函数的参数怎么变成两个了?为什么要用wrapper函数的参数?
            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!")

===================================================================

谢谢


QUOTE:
原帖由 niannian 于 2008-7-11 17:07 发表
return f(*args, **kargs)         ###这里f函数,也就是hello函数的参数怎么变成两个了?为什么要用wrapper函数的参数?

logged 有一定的通用性,能作用在不同的函数上,不仅仅是 hello,所以它用一个序列和一个散列表来装参数。

@logged
def hello
      xxxxxxx

生成一个函数 hello,其形式参数为 args 和 kargs (因为要 log 下传入参数)。在新 hello 的内部,用 hello(*args, **argv) 来调用原来的 hello.

无论 hello 有多少个参数,这样做都不会出错。

retuor ,谢谢

但是为什么生成的函数hello 的参数为args 和 kargs ??
看这段代码:

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/env python                                                           

def f(*args, **kargs):
    print args
    print kargs


f(1,(2,3),a=4,b=5,c=6)



QUOTE:
(1, (2, 3))
{'a': 4, 'c': 6, 'b': 5}

*argv 和 **kargs 分别收集不带 key 的参数和带 key 的参数


logged 返回一个函数 wrapper,捕捉你传给 hello 的参数。hello 的确只使用了一个参数,但其它函数,比如 hell,可能会有很多参数。