【问题标题】:Python sumbodule autloader intellij completion probllemPython子模块自动加载器intellij补全问题
【发布时间】:2019-01-14 18:47:00
【问题描述】:

我做了以下自动加载器

from os import listdir
from os.path import dirname
from importlib import import_module

def replace(dst: dict, src: dict):
    dst.clear()
    dst.update(src)

replace(globals(), {
    module: getattr(import_module('.' + module, __package__), module)
    for module in [
        file.rstrip('.py')
        for file in listdir(dirname(__file__))
        if not file.startswith('__') and file.endswith('.py')
    ]
})

简化从结构如下的目录加载:

mod/
    __init__.py (see above)
    foo.py
    goo.py
    ....py

这样我就不用写丑陋的代码了

from mod.foo import foo

但我可以这样做

from mod import foo

不幸的是,IntelliJ IDEA 社区无法处理它并将 foo 识别为模块。

如何才能在此 IDE 中正确解析我的模块?

【问题讨论】:

  • 为什么那个 import 很难看?你用os.path做同样的事情。
  • @Makoto 不准确,os.path 包含的内容不仅仅是 dirnamedirname 未命名为 path

标签: python intellij-idea pycharm


【解决方案1】:

在 IDE 中,我们不会运行您的代码来收集运行时实际可用的属性,而且此代码过于动态而无法进行静态分析,而且老实说,很少会为其添加一些特殊处理。这意味着我们甚至无法判断这些名称是否存在,更不用说正确解析它们了。

恐怕处理它的唯一方法是使用专用 cmets 抑制所有相应的 IDE 警告,或者将这些名称添加到“未解决的引用”检查的白名单中(或者退回到更传统的导入方法在 Python 中)。

【讨论】:

    猜你喜欢
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    相关资源
    最近更新 更多