【发布时间】:2019-11-09 15:00:15
【问题描述】:
我正在尝试实现一个带参数的装饰器。
这是我的实际代码:
def transactional_function(read_only=False):
"""
A simple wrapper to ensure that the desired function will always runs
inside a transaction, so we don't have to pollute our code with a bunch of
run_as_transactions.
"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kw):
in_transaction = getattr(_thread_local_data, "is_in_transaction", False)
if in_transaction:
result = func(*args, **kw)
else:
if read_only:
return run_as_readonly(func, *args, **kw)
else:
return run_as_transaction(func, *args, **kw)
return result
return wrapper
return decorator
但是,这会在函数声明时自动运行。
所以理论上我只需要一个包装器,但我希望我可以为装饰函数添加参数。
decorated_function(standard_arg, read_only=True)
这有可能吗?我只能实现不带参数的包装器或带参数自动运行的装饰器。
【问题讨论】:
-
您发布的内容不会自动运行装饰功能;让我们看一个实际使用这个装饰器的例子,也许那里有问题。包装器可以接受任何你想要的参数,它没有义务将它们传递给被包装的函数。
-
正如@jasonharper 指出的那样,您的问题的代码不会运行被修饰的函数——所以其他原因导致了这种情况的发生。请edit您的问题并提供minimal reproducible example说明问题。