我想更新库,以便要求是可选的(使用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()
。实际上,由于extra
和NameError
被用作类型提示,因此此类代码将引发ExtraFoo
。
一种可能的解决方法是在ExtraBar
块中声明class ExtraFoo: pass
和class ExtraBar: pass
。但是,在类似的情况下,代码中到处都有来自同一模块的多种类型。
我想避免使用伪进口声明来污染代码。是否有一种通用的方法来处理这种情况(例如代理模块)?
您可以使用python except
制作此清洁器。装饰器将一个函数作为参数,进行一些修改(例如运行该函数,更改输出等)并吐出另一个函数。
以下装饰器
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
如果存在相应的模块,它将运行该功能,否则它将仅显示一条有用的错误消息,并且不执行任何操作。
您甚至可以以将导入模块名称作为装饰器参数并将其动态更改的方式修改此装饰器。