同时用作类型提示时如何处理额外的要求?

问题描述 投票:1回答:1

我想更新库,以便要求是可选的(使用extras_require)。

不幸的是,从可选要求中导入的类在库中的各处都用作类型提示。这是一个例子:

extras_require

在此示例中,如果未安装from typing import List try: from extra.sub import ExtraFoo, ExtraBar except ImportError: pass def optional(foo: ExtraFoo) -> List[Extrabar]: pass def greeting(name: str) -> str: return 'Hello ' + name if __name__ == '__main__': greeting('John Smith') ,我们将不使用optional()。实际上,由于extraNameError被用作类型提示,因此此类代码将引发ExtraFoo

一种可能的解决方法是在ExtraBar块中声明class ExtraFoo: passclass ExtraBar: pass。但是,在类似的情况下,代码中到处都有来自同一模块的多种类型。

我想避免使用伪进口声明来污染代码。是否有一种通用的方法来处理这种情况(例如代理模块)?

python python-3.x python-import setuptools python-importlib
1个回答
-3
投票

您可以使用python except制作此清洁器。装饰器将一个函数作为参数,进行一些修改(例如运行该函数,更改输出等)并吐出另一个函数。

以下装饰器

  • 将您的decorator函数用作输入
  • 检查对应的模块是否存在
  • 如果模块存在,则运行decode功能
  • 如果该模块不存在,它将显示一条有用的消息,但不执行任何操作
decode

您可以像这样使用此装饰器:

from functools import wraps


def catch_exception(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        try:
            from av.frame import Frame

            return func(*args, **kwargs)
        except ModuleNotFoundError:
            print("Module not found, not applying the function.")

    return wrapper

如果存在相应的模块,它将运行该功能,否则它将仅显示一条有用的错误消息,并且不执行任何操作。

您甚至可以以将导入模块名称作为装饰器参数并将其动态更改的方式修改此装饰器。

© www.soinside.com 2019 - 2024. All rights reserved.