gpt4 book ai didi

python-3.x - mypy importlib 模块函数

转载 作者:行者123 更新时间:2023-12-01 02:36:53 26 4
gpt4 key购买 nike

我正在使用 importlib 在运行时导入模块。这些模块是我的应用程序的插件,必须实现 1 个或多个模块级功能。我已经开始向我的应用程序添加类型注释,并且我从 mypy 中得到一个错误声明

Module has no attribute "generate_configuration"



其中“generate_configuration”是模块功能之一。

在这个例子中,模块只需要有一个 generate_configuration 函数。该函数采用单个 dict 参数。
def generate_configuration(data: Dict[str, DataFrame]) -> None: ...

我一直在寻找如何指定模块的接口(interface),但我能找到的只是类接口(interface)。有人可以向我指出一些说明如何执行此操作的文档吗?我的 google-fu 在这方面让我失望了。

加载此模块的代码如下所示。错误是由最后一行产生的。
plugin_directory = os.path.join(os.path.abspath(directory), 'Configuration-Generation-Plugins')
plugins = (
module_file
for module_file in Path(plugin_directory).glob('*.py')
)
sys.path.insert(0, plugin_directory)
for plugin in plugins:
plugin_module = import_module(plugin.stem)
plugin_module.generate_configuration(directory, points_list)

最佳答案

importlib.import_module 的类型注解只需返回 types.ModuleType
来自 the typeshed source :

def import_module(name: str, package: Optional[str] = ...) -> types.ModuleType: ...

这意味着 plugin_module 的显示类型是 Module - 没有您的特定属性。

由于 mypy是一个静态分析工具,它无法知道那个import的返回值有一个特定的接口(interface)。

这是我的建议:
  • 为您的模块创建一个类型接口(interface)(它不必被实例化,它只会帮助 mypy 解决问题)
    class ModuleInterface:
    @staticmethod
    def generate_configuration(data: Dict[str, DataFrame]) -> None: ...
  • 做一个导入你的模块的函数,你可能需要撒# type: ignore , 但是如果你使用 __import__而不是 import_module您也许可以避免此限制
    def import_module_with_interface(modname: str) -> ModuleInterface:
    return __import__(modname, fromlist=['_trash']) # might need to ignore the type here
  • 享受类型:)

  • 我用来验证这个想法的示例代码:
    class ModuleInterface:
    @staticmethod
    def compute_foo(bar: str) -> str: ...


    def import_module_with_interface(modname: str) -> ModuleInterface:
    return __import__(modname, fromlist=['_trash'])


    def myf() -> None:
    mod = import_module_with_interface('test2')
    # mod.compute_foo() # test.py:12: error: Too few arguments for "compute_foo" of "ModuleInterface"
    mod.compute_foo('hi')

    关于python-3.x - mypy importlib 模块函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48976499/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com