我在pyCharm中有一个“假”未解析的引用。
我说“ false”是因为引用实际上可以执行,我的代码可以正常工作,所以我认为这更多是pyCharm问题,无法解析引用并将其标记为红色。
由于我是python的新手,所以我想了解问题的出处。
基本上在我正在处理的代码中,有一个
from PyDAQmx import *
然后在我的代码中,我使用了该库的一些函数/方法/常量。
DAQmxCreateTask(...)
DAQmxStartTask(...)
PyCharm用消息``Unresolved reference DAQmxCreateTask`
标记为红色。如果我这样做
from PyDAQmx import DAQmxCreateTask, DAQmxStartTask
或者我这样做:
import PyDAQmx as PyDAQmx
PyDAQmx.DAQmxCreateTask(...)
然后未解决的参考消失了,所以实际上我有两种解决问题的方法,但是我想了解为什么会发生。
我已经尝试了“使缓存无效并重新启动”的pyCharm选项,但没有成功。
据我了解,如果您执行from foo import *
,则foo内部的所有函数都应被解析和可调用。
示例。
>> linspace(0,10,3)
Unresolved reference linspace
>> from numpy import *
>> linspace(0,10,3)
array([ 0., 5., 10.])
因此,这意味着numpy具有“某些东西”,当使用*导入时,pycharm可以解析pycharm的功能,但PyDAQmx缺少此“东西”
有人可以指导我理解“东西”是什么以及如何解决吗?
答案 0 :(得分:1)
PyDAQmx
通过将它们添加到globals()
字典(来自文件'/Applications/National Instruments/NI-DAQmx Base/includes/NIDAQmxBase.h'
)来动态定义这些功能,因此我猜想PyCharm对第三方库的静态代码分析可以因此,无法识别DAQmxCreateTask
。
您可以在__all__
库的PyDAQmx
的动态定义中看到这一点,而numpy
则不这样做。 __all__
限制from <thing> import *
语句后可用的符号。
我可以通过手动将DAQmxCreateTask
添加到PyDAQmx.__all__
并更新PyCharm框架来“修复”未解决的引用。不使用from PyDAQmx import *
可以方便地为您解决问题,也是最佳做法。
作为库的客户端,在运行时进行这种动态函数创建时,您实际上不需要修复任何东西,但是从理论上讲,库维护者可以将__all__
设置为他们期望的手动符号集从该NIDAQmxBase.h
文件动态定义,以解决客户端问题。