python装饰器的正确使用

python装饰器的正确使用,python,function,decorator,python-decorators,Python,Function,Decorator,Python Decorators,我最近被介绍给了decorators,我知道语法是如何工作的,但我很难知道什么时候值得应用 例如,我有一个返回随机设置值的函数。我想添加额外的功能,如果选择的设置值是某个值,那么其他一些设置将被禁用。这可以很容易地通过将其添加到函数的末尾来实现,但是我可以(并且已经)为此编写一个装饰程序。这是正确的用法吗 def disable_setting(func): '''A decorator that settings depending on the Acquisition Mode se

我最近被介绍给了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)

函数装饰器只是一个函数;你可以随心所欲地使用它

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

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

在编写decorator时,使用是一个很好的实践;这个实用程序修饰符复制函数名、docstring和模块名等内容。

函数修饰符只是一个函数;你可以随心所欲地使用它

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

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

在编写decorator时,使用是一个很好的实践;这个实用程序修饰符复制函数名、docstring和模块名等内容。

函数修饰符只是一个函数;你可以随心所欲地使用它

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

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

在编写decorator时,使用是一个很好的实践;这个实用程序修饰符复制函数名、docstring和模块名等内容。

函数修饰符只是一个函数;你可以随心所欲地使用它

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

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


在编写decorator时,使用是一个很好的实践;此实用程序修饰符复制函数名、docstring和模块名等内容。

是的,请包含代码。除非您计划将修饰符应用于多个函数,否则您应该直接修改函数。使用装饰器进行封装或重构。@msvalkon我已经按照要求包含了代码。只是吹毛求疵而已。。您将
random\u setting
的第一个参数设置为
self
,但实际上并没有在包装器中传递函数
self
selected_value=func(*args,**kwargs)[1]
@Calpratt抱歉,是的,您是正确的。是的,请包含代码。除非您计划将装饰程序应用于多个函数,否则您应该直接修改该函数。使用装饰器进行封装或重构。@msvalkon我已经按照要求包含了代码。只是吹毛求疵而已。。您将
random\u setting
的第一个参数设置为
self
,但实际上并没有在包装器中传递函数
self
selected_value=func(*args,**kwargs)[1]
@Calpratt抱歉,是的,您是正确的。是的,请包含代码。除非您计划将装饰程序应用于多个函数,否则您应该直接修改该函数。使用装饰器进行封装或重构。@msvalkon我已经按照要求包含了代码。只是吹毛求疵而已。。您将
random\u setting
的第一个参数设置为
self
,但实际上并没有在包装器中传递函数
self
selected_value=func(*args,**kwargs)[1]
@Calpratt抱歉,是的,您是正确的。是的,请包含代码。除非您计划将装饰程序应用于多个函数,否则您应该直接修改该函数。使用装饰器进行封装或重构。@msvalkon我已经按照要求包含了代码。只是吹毛求疵而已。。您将
random\u setting
的第一个参数设置为
self
,但实际上并没有在包装器中传递函数
self
selected_value=func(*args,**kwargs)[1]
@Calpratt抱歉,是的,您是正确的。