我最近介绍了装饰器,我知道语法是如何工作的,但我很难知道什么时候值得申请。
例如,我有一个返回随机设置值的函数。我想添加额外的功能,如果选择的设置值是某个值,则禁用其他一些设置。这可以通过将其添加到函数的末尾来轻松实现,但我可以(并且已经)为此编写了一个装饰器。这是正确的用法吗?
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)
答案 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和模块名之类的东西。