从Python模块导入的Decorator无法正常工作

时间:2015-10-23 09:41:27

标签: python python-2.7 ipython decorator

我正在尝试对iPython笔记本中定义或导入的函数使用以下装饰器:

import warnings

def deprecated(func):
    '''This is a decorator which can be used to mark functions
    as deprecated. It will result in a warning being emitted
    when the function is used.'''
    def new_func(*args, **kwargs):
        warnings.warn("Call to deprecated function {}.".format(func.__name__),
                  category=DeprecationWarning)
        return func(*args, **kwargs)
    new_func.__name__ = func.__name__
    new_func.__doc__ = func.__doc__
    new_func.__dict__.update(func.__dict__)
    return new_func

我在utils.py中定义了装饰器。当我以这种方式使用装饰器时:

import utils #from utils import deprecated

@utils.deprecated
def test():
    print 'Brokolice'

然后运行test()打印' Brokolice',但不会发出任何警告。但是,当我在iPython中定义装饰器时,我得到了所需的弃用警告。

我正在使用Python 2.7并且我对装饰器或Python一般都不太满意,但在这种情况下,我不知道出了什么问题,因为如果装饰器的导入失败,我会发现某种错误。

2 个答案:

答案 0 :(得分:2)

尝试在warnings.filterwarnings('always')

下配置import warnings
In [1]: import test

In [2]: test.test()
warning
utils.py:12: DeprecationWarning: Call to deprecated function test.
  category=DeprecationWarning)
Brokolice

答案 1 :(得分:1)

python -Wd test.py  #  -Wdefault

这将打印DeprecationWarning警告,默认情况下由python2.7隐藏。有关详细信息,请参阅here

对于你的问题“任何想法为什么这行”返回func(* args,** kwargs)“也会被打印出来?”。

这只是为了便于阅读..

长度(线)应该在pep8中<= 80