我有自己的 python 库。我使用其中的装饰器@send_transport
。
@send_transport(program_version=__version__, entity=1)
def post(self):
pass
我可以实现这样的东西吗?
try:
from spo_client import send_transport
except ImportError:
pass
else:
@send_transport(program_version=__version__, entity=1)
def post(self):
pass
最佳答案
为了实现你的目标,你可以这样做
try:
from spo_client import send_transport
decorator = send_transport(program_version=__version__, entity=1)
except ImportError:
decorator = lambda f: f
@decorator
def post(self):
pass
这会创建“正确”的装饰器或一个虚拟的装饰器,在该装饰器上将函数转换为自身,即。 e.别管它。
另一种选择可能是定义一个虚拟send_transport
函数:
def dummy_send_transport(*a, **k):
return lambda f: f
try:
from spo_client import send_transport
except ImportError:
send_transport = dummy_send_transport
# or just send_transport = lambda *a, **k: lambda f: f
# but then the code would be less self-documenting.
@send_transport(program_version=__version__, entity=1)
def post(self):
pass
在这种情况下,在导入错误时,send_transport()
会被一个仅返回 NOP 装饰器的版本替换,但可以将其称为“原始版本”。在这里,您可以在代码中进行多个不同的 send_transport
调用,而不必为它们预定义变量。
关于python - 我可以根据条款使用装饰器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56899581/