如何用我自己的python来包装第三方装饰器



我看到很多用自己的装饰器包装装饰器的例子,但它们都是关于自定义装饰器的。我有一个第三方装饰器,可以使用,例如:

@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

最新更新