Python PyCharm:如何推断运行时创建的对象类型

Python PyCharm:如何推断运行时创建的对象类型,python,pycharm,runtime,type-hinting,Python,Pycharm,Runtime,Type Hinting,我试图使用一个库来创建对象,并在运行时将它们添加到全局名称空间 PyCharm找不到对对象的引用,因为它们最初不在名称空间中 我怎样才能让PyCharm内省不抱怨“找不到参考…”?我不想使用noinspection标记 示例代码 为了澄清我的问题,我起草了使用PyCharm中运行时创建的对象的示例代码 main.py 从某些对象导入导入某些对象1 如果名称=“\uuuuu main\uuuuuuuu”: print(f“obj_1.some_attr={some_obj_1.some_attr

我试图使用一个库来创建对象,并在运行时将它们添加到全局名称空间

PyCharm找不到对对象的引用,因为它们最初不在名称空间中

我怎样才能让PyCharm内省不抱怨“找不到参考…”?我不想使用
noinspection
标记


示例代码

为了澄清我的问题,我起草了使用PyCharm中运行时创建的对象的示例代码

main.py

从某些对象导入导入某些对象1
如果名称=“\uuuuu main\uuuuuuuu”:
print(f“obj_1.some_attr={some_obj_1.some_attr}”)
some_import.py

class-SomeClass:
定义初始化(self,attr\u init:int=0):
self.some\u attr=attr\u init
globals()[“some_obj_1”]=SomeClass(1)
运行
main.py的输出

obj_1.some_attr=1
我在PyCharm中看到:


相关文章

本文建议为code insight启用
收集运行时类型信息。但是,启用此设置并运行调试器并没有解决我的问题


可能的解决方案

  • 制作PyCharm存根文件
  • 使用PyCharm
    noinspection
    tag+a类型提示抑制错误消息
    • 这是“手册”,因此我不太喜欢这个解决方案
#无检查PYUNsolvedReferences
从一些导入导入一些对象1,一些类
some_obj_1:SomeClass
如果名称=“\uuuuu main\uuuuuuuu”:
print(f“obj_1.some_attr={some_obj_1.some_attr}”)


这是使用
python3.7.6
python3.2.5ce
实现的。下面的链接使我认为,仅使用模块名是可能的

我已经编写了这段代码,但我很难测试,因为我使用的是Spyder,这与您最初的尝试是一致的

import some_import as si


if __name__ == "__main__":
    print(f"obj_1.some_attr = {si.some_obj_1.some_attr}")

pycharm在不运行代码的情况下无法确定这些事情。您可以编写存根文件,使用示例中的硬编码声明,或者编写一个pycharm插件,允许您将信息传递给pycharm。例如,您可以编写一个pycharm插件,解析变异的
globals()
感谢@kmark确认我的阅读/直觉!当然,这不是解决方案,但如果您知道要创建的对象的名称(如示例中所示),也就是说,如果对象的名称不在变量中(如
globals()[varname]=…
),则无需触摸
main.py
,您总是可以在
some_import.py
中动态创建变量之后添加类型提示行。Good thinking@JCGonzalez!我对此进行了测试,这是一个可行的解决方案:)。只有在可以更改
某些导入.py
时,它才起作用。不幸的是,在我的例子中,
一些导入.py
在第三方pip可安装包中。哎呀,真倒霉。。。无论如何,正如我所说,这不是一个完整的解决方案。希望有人会带来一个像@kmark指向的插件……你好@Alistair!谢谢你的拍摄。然而,这是行不通的。它所做的只是将导入行中的
找不到引用
警告移动到
\uuuu主代码块内。