python装饰器的正确使用
我最近被介绍给了decorators,我知道语法是如何工作的,但我很难知道什么时候值得应用 例如,我有一个返回随机设置值的函数。我想添加额外的功能,如果选择的设置值是某个值,那么其他一些设置将被禁用。这可以很容易地通过将其添加到函数的末尾来实现,但是我可以(并且已经)为此编写一个装饰程序。这是正确的用法吗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
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抱歉,是的,您是正确的。