【问题标题】:pyCharm Unresolved reference syntax highlightingpyCharm 未解决的参考语法高亮
【发布时间】:2019-11-14 03:29:28
【问题描述】:

我在 pyCharm 中有一个“错误”的未解析引用。

我说“假”是因为引用实际上可以执行,我的代码工作正常,所以我认为更多的是 pyCharm 问题无法解析引用并将它们标记为红色。

由于我对 python 还很陌生,所以我想了解问题出在哪里。

基本上在我正在处理的代码中,有一个

from PyDAQmx import *

然后在我的代码中我使用了这个库的一些函数/方法/常量。

DAQmxCreateTask(...)
DAQmxStartTask(...)

PyCharm 将此引用标记为红色,并显示消息“未解析的引用 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 在使用 * 导入时解析它的功能,但 PyDAQmx 缺少这个“东西”

有人可以指导我理解这个“东西”是什么以及如何解决它吗?

【问题讨论】:

  • 虽然不太可能是导致问题的原因,但from foo import * 现在通常被认为是糟糕的编码风格。您应该明确导入您需要的对象/类。
  • 虽然不太可能是导致问题的原因,但from foo import * 现在通常被认为是糟糕的编码风格。您应该明确导入您需要的对象/类。

标签: python import pycharm


【解决方案1】:

PyDAQmx 正在通过将这些函数添加到globals() dict(来自文件'/Applications/National Instruments/NI-DAQmx Base/includes/NIDAQmxBase.h')来动态定义这些函数,所以我猜PyCharm 对第三方库的静态代码分析无法识别DAQmxCreateTask 由于到这个。

您可以在PyDAQmx 库中__all__ 的动态定义中看到这一点,而numpy 没有这样做。 __all__ 限制 from <thing> import * 语句后可用的符号。

我能够通过手动将DAQmxCreateTask 添加到PyDAQmx.__all__ 并更新PyCharm 骨架来“修复”未解析的引用。不使用from PyDAQmx import * 可以方便地为您解决问题,也是最佳实践。

作为在运行时创建这种动态函数的库的客户端,您实际上不需要修复任何问题,但理论上库维护者可以将 __all__ 设置为他们期望的手动符号集从该NIDAQmxBase.h 文件动态定义以解决客户的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 2020-01-20
    • 2014-05-05
    相关资源
    最近更新 更多