python - 使用装饰器停用功能

标签 python decorator python-decorators

是否可以使用 python 装饰器“停用”一个函数?这里有一个例子:

cond = False

class C:

    if cond:
        def x(self): print "hi"

    def y(self): print "ho"

是否可以像这样用装饰器重写这段代码?:

class C:

    @cond
    def x(self): print "hi"

    def y(self): print "ho"

背景:在我们的库中有一些依赖项(如 matplotlib)是可选的,并且只有少数功能(用于调试或前端)需要这些。这意味着在某些系统上 matplotlib 没有安装在其他系统上,但两者都应该运行(核心)代码。因此,如果未安装 matplotlib,我想禁用某些功能。有这么优雅的方式吗?

最佳答案

您可以使用装饰器将函数变成无操作(记录警告):

def conditional(cond, warning=None):
    def noop_decorator(func):
        return func  # pass through

    def neutered_function(func):
        def neutered(*args, **kw):
            if warning:
                log.warn(warning)
            return
        return neutered

    return noop_decorator if cond else neutered_function

这里 conditional 是一个装饰工厂。它根据条件返回两个装饰器之一。

一个装饰器只是让函数保持不变。另一个装饰器完全替换了被装饰的函数,而是发出警告。

使用:

@conditional('matplotlib' in sys.modules, 'Please install matplotlib')
def foo(self, bar):
    pass

关于python - 使用装饰器停用功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17946024/

相关文章:

python - 在 Python 中创建单例

python - 如何在可重写的类方法上使用装饰器

python - 如何根据需要用 gflags 标记一个标志?

python - 使用双回车将大文本文件分成单独的文件

统计Sweep算子的Python实现

java - 装饰器模式在 Java 中如何工作?

python - 无法使用装饰器处理具有不同分页的两个链接

Python装饰器在类中获取或设置字典值

python - 是否有用于在 Django 中实现 View 模型装饰器 ala Draper 的库?

python - OpenERP 立即创建和编写方法