相关疑难解决方法(0)

functools.wraps有什么作用?

对另一个问题的答案的评论中,有人说他们不确定functools.wraps在做什么.所以,我问这个问题,以便在StackOverflow上有一个记录,供将来参考:究竟functools.wraps做了什么?

python decorator functools

588
推荐指数
6
解决办法
12万
查看次数

保留装饰功能的签名

假设我编写了一个装饰器来做一些非常通用的东西.例如,它可能会将所有参数转换为特定类型,执行日志记录,实现memoization等.

这是一个例子:

def args_as_ints(f):
    def g(*args, **kwargs):
        args = [int(x) for x in args]
        kwargs = dict((k, int(v)) for k, v in kwargs.items())
        return f(*args, **kwargs)
    return g

@args_as_ints
def funny_function(x, y, z=3):
    """Computes x*y + 2*z"""
    return x*y + 2*z

>>> funny_function("3", 4.0, z="5")
22
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都很顺利.然而,有一个问题.装饰函数不保留原始函数的文档:

>>> help(funny_function)
Help on function g in module __main__:

g(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

幸运的是,有一个解决方法:

def args_as_ints(f):
    def g(*args, **kwargs):
        args = [int(x) for x in args]
        kwargs = dict((k, int(v)) for k, v in kwargs.items()) …
Run Code Online (Sandbox Code Playgroud)

python decorator

102
推荐指数
5
解决办法
1万
查看次数

Python装饰器让函数忘记它属于一个类

我正在尝试编写一个装饰器来做日志记录:

def logger(myFunc):
    def new(*args, **keyargs):
        print 'Entering %s.%s' % (myFunc.im_class.__name__, myFunc.__name__)
        return myFunc(*args, **keyargs)

    return new

class C(object):
    @logger
    def f():
        pass

C().f()
Run Code Online (Sandbox Code Playgroud)

我想要打印:

Entering C.f
Run Code Online (Sandbox Code Playgroud)

但我收到此错误消息:

AttributeError: 'function' object has no attribute 'im_class'
Run Code Online (Sandbox Code Playgroud)

据推测,这与'logger'中'myFunc'的范围有关,但我不知道是什么.

python reflection metaprogramming

59
推荐指数
6
解决办法
2万
查看次数