相关疑难解决方法(0)

如何在python中"将事后"附加到一个函数的装饰器?

我理解python中函数的装饰器(我可能错了)的方法是,它们应该添加副作用并修改函数的返回值.现在装饰器被添加到要装饰的函数的函数定义之上或通过赋值.这是一个小例子:

def print_args_decor(function):
    def wrapper(*args, **kwargs):
        print 'Arguments:', args, kwargs         # Added side-effect
        return function(*args, **kwargs)*5       # Modified return value
    return wrapper

@print_args_decor
def do_stuff(strg, n=10):
    """Repeats strg a few times."""
    return strg * n

new_decorated_func = print_args_decor(do_stuff)  # Decoration by assignment

print do_stuff('a', 2) # Output: aaaaaaaaaa
Run Code Online (Sandbox Code Playgroud)

现在,如何将装饰器附加到其他地方定义的函数,理想情况下保留原始函数的名称和文档字符串(如同functools.wraps)?例如,我sqrt()从Python的数学模块导入函数,并想要装饰它,我该怎么做呢?

from functools import wraps
from math import sqrt

def print_args_decor(function):
    @wraps(function)
    def wrapper(*args, **kwargs):
        print 'Arguments:', args, kwargs         # Added side-effect
        return function(*args, …
Run Code Online (Sandbox Code Playgroud)

python decorator python-2.7 python-decorators

9
推荐指数
1
解决办法
2581
查看次数

不能将line_profiler与Cython一起使用

基于对答案这个问题,我试图用line_profiler用cythonized功能.

在上述问题上,接受的答案为我们提供了一个如何在jupyter笔记本中使用它的例子.

但是,当我尝试pyx使用disutils 构建文件时,它不起作用.

我明确地尝试使用脚本来运行

kernprof -l -v script.py
Run Code Online (Sandbox Code Playgroud)

它只返回Timer unit经过的时间.

如果我尝试使用cython文件修饰函数@profile,它不会编译返回:

undeclared name not builtin: profile
Run Code Online (Sandbox Code Playgroud)

有任何想法吗 ?

python cython line-profiler

6
推荐指数
1
解决办法
418
查看次数