使用python importlib会导致自动完成和lint丢失

使用python importlib会导致自动完成和lint丢失,python,visual-studio-code,autocomplete,pylint,python-importlib,Python,Visual Studio Code,Autocomplete,Pylint,Python Importlib,首先。一些背景。我有一个类可以帮助导入几个模块,因为这是动态完成的。使用importlib库很重要,到目前为止,一切正常。但是自动完成功能完全丢失,lint没有响应(vs代码) 问题是:如何恢复自动完成和皮棉 下面是示例代码: # ----------- file foo.py import typing, types, importlib print("foo was imported!") class foo () : def __init__ ( sel

首先。一些背景。我有一个类可以帮助导入几个模块,因为这是动态完成的。使用importlib库很重要,到目前为止,一切正常。但是自动完成功能完全丢失,lint没有响应(vs代码)

问题是:如何恢复自动完成和皮棉

下面是示例代码:


# ----------- file foo.py
import typing, types, importlib

print("foo was imported!")

class foo () : 
    def __init__ ( self ) : pass
    def foo_get_doble( self, number : int ) -> int : return number*2
    def foo_print_hello_word( self ) -> None : print("hello world")


# ----------- file __init__.py
import typing, sys, importlib

if __package__ : 
    template_module = importlib.import_module( f"{__package__}.foo" )
else : 
    print( "NO PKG" )
    sys.path.append( r"C:\working_folder" )
    foo_mod = importlib.import_module( "foo" )

importlib.reload( foo_mod )
# foo_class = foo_mod.  # NO HINTS NO LINT NO TYPE CHECK NOTHING (vs-code)
foo_class = foo_mod.foo() # but its there. works.

#output
# NO PKG
# foo was imported!
# foo was imported!

导入后我的期望:

我得到的是:

编辑


经过长时间的搜索。importlib似乎不返回自定义模块。但是一个打字模组什么的。这是一种泛型模块类。当我从模块中得到任何东西时,我会得到这样一个TypeAny。然而,知道这一点并不能解决问题。我是如何铸造这种类型的。或者作为模块的填充,以便识别类和方法?

在VS代码中,Python的Linting函数和自动完成函数由Python扩展提供。因此,建议您重新安装python扩展并重新加载VS代码

对于python代码分析工具的使用,以Pylint为例,请在当前使用的python环境中安装模块“Pylint”,然后运行它

更新:

当我使用“
from de.foo import fo
”导入文件“
foo.py
”中的fo()方法时,“
class_foo.f
”显示自动完成选项:

由于VS代码在搜索文件时默认从当前文件的父文件夹开始,因此作为确保代码运行的示例,我添加了代码

import sys
sys.path.append("./")
,它将文件路径添加到系统路径,以帮助VS代码找到它


参考资料:。

经过大量研究这是不可能的。因为数据是在运行时创建的。所以VSCode(或任何编辑器)都可以提前获取信息。只有在创建之后、执行之后才可能。更接近的解决方案是使用Jupyter笔记本,但不适用于大型文件。

您的意思是,在导入模块“importlib”之前,当您输入“foo_class=foo_mod.”时,VSCode是否可以自动完成?您是否检查过python代码分析工具在您当前使用的python环境中是否可用?我更新了这个问题,希望它能更清楚地说明情况如何?只是想看看提供的信息是否有用。我也写了一个答案。由于行:from de.foo import fo是静态类型的(不使用importlib),因此您得到了自动完成。您之所以使用de.foo,是因为您事先知道变量。这就是我使用importlib的原因。导入是用户定义的。Thansk Jill,阅读你的anwser间接帮助发现发生了。-你可以将你的回答标记为帮助其他有同样疑问的人的答案。嗯,你说对了一半。但是你不能得到foo_类的3个方法。它现在显示的是一个。。。通用类?它应该显示:foo\u class.f->foo\u get\u doble()和foo\u print\u hello\u world()。我将通过添加此更新问题。@user70587-我更新了我的答案,您可以参考它。