使用可选依赖的装饰器

Jul*_* S. 5 python python-import python-decorators

假设我有以下代码:

try:
    import bar
except ImportError:
    bar = None

@bar.SomeProvidedDecorator
def foo():
    pass
Run Code Online (Sandbox Code Playgroud)

其中bar是一个可选的依赖项。如果 bar 未导入,则上面的代码将失败。有没有推荐的方法来处理这个问题?

我想出了:

try:
    import bar
except ImportError:
    bar = None

def foo():
    pass

if bar is not None:
    foo = bar.SomeProvidedDecorator(foo)
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有更好的方法来处理这个问题(即有没有办法保留装饰器语法)?

Rom*_*lka 6

bar不可用的情况下提供标识装饰器:

try:
    import bar
except ImportError:
    class bar:
        SomeProvidedDecorator = lambda f: f
Run Code Online (Sandbox Code Playgroud)

  • 如果模块 `bar` 中有很多装饰器,你可以在回退类中定义 `__getattr__`,例如 `def __getattr(self, name)__: return lambda f: f` (2认同)