我可以根据条款使用装饰器吗?

时间:2019-07-05 08:42:07

标签: python python-2.7

我有自己的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

1 个答案:

答案 0 :(得分:4)

为了实现您的目标,您可以做

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调用,而不必为它们预定义变量。