Подтвердить что ты не робот

Невозможно найти ссылку "xxx" в __init__.py - Python/Pycharm

У меня есть проект в Pycharm, организованный следующим образом:

-- Sources
   |--__init__.py
   |--Calculators
      |--__init__.py
      |--Filters.py
   |--Controllers
      |--__init__.py
      |--FiltersController.py
   |--Viewers
      |--__init__.py
      |--DataVisualization.py
   |--Models
      |--__init__.py
      |--Data

Все мои __init__.py, за исключением одного, расположенного выше Источники, являются пустыми. Я получаю много предупреждений такого рода:

Невозможно найти ссылку "xxx" в init.py

Например, мой FiltersController.py имеет этот фрагмент кода:

import numpy.random as npr

bootstrap = npr.choice(image_base.data[max(0, x-2):x+3, max(0, y-2):y+3].flatten(), size=(3, 3), replace=True)

И я получаю это предупреждение:

Невозможно найти ссылку "выбор" в __init __. py

Я ищу googling, что это значит и что мне делать, чтобы правильно кодировать Python.

Спасибо заранее.

4b9b3361

Ответ 1

Это ошибка в pycharm. Кажется, что PyCharm ожидает, что ссылочный модуль будет включен в оператор __all__ = [].

Для правильного кодирования этикета следует включить инструкцию __all__ из ваших модулей? Это на самом деле вопрос, который мы слышим, как молодой Спок отвечает во время его тестирования, на что он ответил: "Это морально похвально, но не морально обязательно".

Чтобы обойти это, вы можете просто отключить этот (крайне некритический) (очень полезный) осмотр в глобальном масштабе или подавить его для конкретной функции или оператора.

Для этого:

  • поместите курсор над текстом ошибки ( "выбор", из вашего примера выше)
  • Поднимите меню намерения (alt-enter по умолчанию, my установлен в alt-backspace)
  • нажмите стрелку вправо, чтобы открыть подменю, и выберите соответствующее действие

PyCharm имеет свою долю небольших ошибок, подобных этому, но, на мой взгляд, его преимущества намного перевешивают его недостатки. Если вы хотите попробовать другую хорошую среду IDE, там также Spyder/Spyderlib.

Я знаю, что это довольно немного после того, как вы задали свой вопрос, но я надеюсь, что это поможет (вам или кому-то еще).

Отредактировано:. Первоначально я думал, что это было специфично для проверки __all__, но похоже, что это более общая проверка "Unresolved References", которая может быть очень полезна. Вероятно, лучше всего использовать отключение функции на уровне инструкций с помощью меню, упомянутого выше, или указав # noinspection PyUnresolvedReferences в строке, предшествующей инструкции.

Ответ 2

Вы должны сначала взглянуть на this. Это объясняет, что происходит при импорте пакета. Для удобства:

Оператор import использует следующее соглашение: если код пакета __init__.py определяет список с именем __all__, он считается списком имен модулей, который должен быть импортирован, когда встречается from package import *. Автору пакета рекомендуется сохранить этот список в актуальном состоянии при выпуске новой версии пакета. Авторы пакета могут также решить не поддерживать его, если они не видят использования для импорта * из своего пакета.

Итак, PyCharm уважает это, показывая предупреждение, так что автор может решить, какой из модулей будет импортироваться, когда * из пакета будет импортирован. Таким образом, это, по-видимому, является полезной особенностью PyCharm (и никоим образом это не может быть названо ошибкой, я полагаю). Вы можете легко удалить это предупреждение, добавив имена модулей, которые будут импортированы, когда ваш пакет будет импортирован в переменную __all__, которая является списком, например этот

__ __ INIT. Ру

from . import MyModule1, MyModule2, MyModule3
__all__ = [MyModule1, MyModule2, MyModule3]

После того, как вы добавите это, вы можете ctrl+click использовать эти имена модулей, используемые в любой другой части вашего проекта, для прямого перехода к объявлению, которое я часто считаю очень полезным.