pyCharm Неразрешенная подсветка синтаксиса ссылок - PullRequest
2 голосов
/ 03 июля 2019

У меня есть "ложная" неразрешенная ссылка в pyCharm.

Я говорю "ложно", потому что ссылки на самом деле могут быть выполнены, мой код работает нормально, поэтому я думаю, что это проблема pyCharm, которую невозможно решитьссылки и помечает их красным.

Поскольку я довольно плохо знаком с Python, я хотел бы понять, откуда возникла проблема.

В основном в коде, с которым я имею дело, естьa

from PyDAQmx import *

и затем в своем коде я использую некоторые функции / методы / константы этой библиотеки.

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

PyCharm помечает эти ссылки красным цветом с сообщением ``Неразрешенная ссылка DAQmxCreateTask`

Если я сделаю

from PyDAQmx import DAQmxCreateTask, DAQmxStartTask

или я сделаю:

import PyDAQmx as PyDAQmx   
PyDAQmx.DAQmxCreateTask(...)

, то Неразрешенная ссылка исчезнет, ​​поэтому у меня фактически есть два способа решениямоя проблема, но я хочу понять, почему это происходит.

Я уже попробовал опцию pyCharm "Invalidate cache and restart" безуспешно.

Насколько я понимаю, если вы выполните 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 не имеет этого"что-то"

Может ли кто-нибудь помочь мне понять, что это за "что-то" и как его решить?

1 Ответ

1 голос
/ 03 июля 2019

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, чтобы решить проблему для клиентов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...