正确使用python装饰器

时间:2014-04-23 13:56:35

标签: python function decorator python-decorators

我最近介绍了装饰器,我知道语法是如何工作的,但我很难知道什么时候值得申请。

例如,我有一个返回随机设置值的函数。我想添加额外的功能,如果选择的设置值是某个值,则禁用其他一些设置。这可以通过将其添加到函数的末尾来轻松实现,但我可以(并且已经)为此编写了一个装饰器。这是正确的用法吗?

def disable_setting(func):
    '''A decorator that settings depending on the Acquisition Mode set'''

    def wrap_disable(self, *args, **kwargs):
        chosen_value = func(self, *args, **kwargs)[1]
        if chosen_value != "Accumulate":
            for setting in self.settings:
                if setting[0] == "Accumulation Number":
                    setting[1] = 1
            if chosen_value != "Kinetic":
                for setting in self.settings:
                    if setting[0] == "Kinetic Series Length" or "Cycle Time":
                        setting[1] = 1

#############################################################

@disable_setting
def random_setting(self, options):
    if type(options) is list:
        if len(options) == 1:
            options.append(options[0] + 1)  # Specify static value by the inclusion of only on variable
        if len(options) == 2:
            options.append(1)  # To allow for the settings with a step the default step value must be stated
        return randrange(options[0], options[1], options[2])
    elif type(options) is dict:
        return choice(options)

1 个答案:

答案 0 :(得分:3)

函数装饰器只是一个函数;你可以自由地做你想做的事。

响应装饰函数的输出是一个很好的用例;它看起来像:

from functools import wraps


def yourdecorator(func):
    @wraps(func):
    def wrapper(*args, **kw):
        result = func(*args, **kw)
        if result in certain_values:
            adjust_other_configuration()
        return result
    return wrapper

在编写装饰器时使用@functools.wraps()是一个很好的做法;这个实用程序装饰器复制了诸如函数名,docstring和模块名之类的东西。