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

标签 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

最佳答案

为了实现你的目标,你可以这样做

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/

相关文章:

python - 如何防止通过 for 循环覆盖字典中的数据

python - 使用负索引在 Python 中访问整个字符串

python - 防止其他类的方法调用我的构造函数

python - 用python循环绘制棋盘

python - 如何遮盖圆形区域?

python - response.write 但对于内容类型正确的文件?

python - ModuleNotFoundError : No module named 'requests'

python - 如何将统一的差异文件应用到原始文件?

python - 在 Python 中编写 Elasticsearch 身份验证

python - 与networkx的暴力图同构