获取装饰功能的名称?

Rad*_*Hex 26 python django decorator

这是我的装饰者:

def check_domain(func):

    def wrapper(domain_id, *args, **kwargs):
        domain = get_object_or_None(Domain, id=domain_id)
        if not domain:
            return None
        return func(domain_id, *args, **kwargs)

    return wrapper
Run Code Online (Sandbox Code Playgroud)

这是一个包裹的功能:

@check_domain
def collect_data(domain_id, from_date, to_date):
    do_stuff(...)
Run Code Online (Sandbox Code Playgroud)

如果我这样做,collect_data.__name__我会得到wrapper而不是collect_data

有任何想法吗?

Zac*_*ela 39

不需要functools.wraps!只是用method.__name__

import time

def timeit(method):
    def timed(*args, **kw):
        ts = time.time()
        result = method(*args, **kw)
        te = time.time()
        print('Function', method.__name__, 'time:', round((te -ts)*1000,1), 'ms')
        print()
        return result
    return timed

@timeit
def math_harder():
    [x**(x%17)^x%17 for x in range(1,5555)]
math_harder()

@timeit
def sleeper_agent():
    time.sleep(1)
sleeper_agent()
Run Code Online (Sandbox Code Playgroud)

输出:

Function math_harder time: 8.4 ms
Function sleeper_agent time: 1003.7 ms
Run Code Online (Sandbox Code Playgroud)

  • 在 OP 的情况下,不需要 `functools.wraps`,你是对的 - 不过,在大多数(其他)情况下使用它仍然是更好的方法。 (3认同)

Tom*_*gli 18

您可能需要使用wrapsfunctools.

有一个明显的例子似乎适合你:)

  • 这是正确的答案 (2认同)

tke*_*win 7

除了 之外functools.wraps,您还可以查看旨在帮助解决此问题的 装饰器模块。