我看到很多用自己的装饰器包装装饰器的例子,但它们都是关于自定义装饰器的。我有一个第三方装饰器,可以使用,例如:
@someSDK
myFunction()
我想做的是将其封装在我自己的decorator中,该decorator仅在env设置为true 时调用@someSDK
编辑:具体来说,第三方装饰器是@xray_recorder.capture()
。我想要我自己的装饰器,只有当我有一个变量集作为某个标志时,它才会实现这一点。
这是我目前为止的一个粗略想法:
if CUSTOM_XRAY_WRAPPER is True:
@xray_recorder.capture()
def wrapper(*args, **kwargs):
val = func(*args, **kwargs)
return val
return wrapper
else:
def wrapper(*args, **kwargs):
val = func(*args, **kwargs)
return val
return wrapper
作为一个小例子,因为您还没有提供一个最小的可复制示例:
CUSTOM_XRAY_WRAPPER = True
def xray_capture(func):
def wrapper(*args, **kwargs):
print('recodring')
return func(*args, **kwargs)
return wrapper
def yourdecorator(func):
if CUSTOM_XRAY_WRAPPER:
return xray_capture(func)
return func
@yourdecorator
def yourfunction(text):
print(text)
这里,在函数上使用xray_capture
装饰器打印";记录";在执行该功能之前。函数yourdecorator
可以用作装饰器,如果CUSTOM_XRAY_WRAPPER为False,则可以原样返回正常函数。如果为True,则返回用xray_capture
修饰的函数。
顺便说一句,你不必写CUSTOM_XRAY_WRAPPER == True
,因为它已经是True或False,这意味着你要检查True == True
还是False == True
。
转移到你的例子中,这看起来像这样:
def yourdecorator(func):
if CUSTOM_XRAY_WRAPPER:
xray_recorder.capture()(func)
return func
您需要记住的是
@decorator
def foobar():
...
相当于
def foobar():
...
foobar = decorator(foobar)
所以你想要的是
def my_decorator(f):
if CUSTOM_XRAY_WRAPPER:
return xray_recorder.capture()(f)
else:
return f
您可以重命名装饰器并使用传递:
from functools import wraps
MY_ENV_VAR = True
# create a pass-through wrapper
def sample_decorator(f):
@wraps(f)
def wrapper(*args, **kwargs):
return f(*args, **kwargs)
return wrapper
# now you can just use the same decorator everywhere
if MY_ENV_VAR:
# use your recorder.capture
x_ray_capture = xray_recorder.capture()
else:
# pass-through
x_ray_capture = sample_decorator
@x_ray_capture
def foo():
# do something