Как сделать автоимпорт pycharm из numpy, а не numpy.ma.core? - PullRequest
0 голосов
/ 13 января 2019

Я использую несколько простых функций и для удобства чтения я предпочитаю импортировать их одну за другой, а не импортировать как np.

Я использую Pycharm IDE, и он автоматически предлагает импортировать из numpy.ma.core, а не просто из numpy.

В прошлом у меня были проблемы с использованием замаскированных массивов: не возникало ошибки, когда я ожидал, что это произойдет, и я не осознавал, что использую замаскированные массивы из-за этого автоматического импорта из pycharm. Поэтому я хочу избегать использования библиотеки, но был бы рад, если бы Pycharm все еще мог выполнять импорт автоматически для меня, а не для того, чтобы я делал это вручную в верхней части кода.

Вот пример функции copy из numpy. Pycharm предлагает импортировать из numpy.ma.core, я хотел бы предложить просто numpy.

Любой

Autocomplete in Pycharm

1 Ответ

0 голосов
/ 13 января 2019

«проблема»

Требуемая функция фактически указана в отображаемом окне автозаполнения, и это numpy.lib.function_base.copy. Вы можете доказать это себе с помощью следующего assert:

import numpy as np
assert np.lib.function_base.copy is np.copy

Причиной путаницы в пространстве имен является то, что функция numpy.copy действительно определена в numpy.lib.function_base (ссылка ведет на источник). numpy.lib.function_base.copy затем экспортируется в пространство имен numpy верхнего уровня с помощью кода в файле __init__.py верхнего уровня в источнике Numpy. Таким образом, Pycharm переходит к исходному определению copy в numpy.lib.function_base.copy вместо псевдонима в numpy.copy.

Лучшее исправление

В самых строгих выражениях я бы рекомендовал, чтобы в вашем коде вы переключились на использование синтаксиса, например:

import numpy as np
np.copy(...)

вместо любого использования, например:

from numpy import copy
copy(...)

Для этого есть два очень веских аргумента: философский и практический:

  • Zen of Python говорит нам

    Явное лучше, чем неявное.

    Использование в вашем коде, например np.copy, сразу же сообщает читателю, что вы хотите использовать функцию копирования из Numpy, а не, скажем, copy.copy. Особенно, если ваш файл .py имеет длину в несколько сотен строк, никто (включая вас самих через три месяца) не узнает, что вы импортировали вверху, что приведет к путанице.

  • На практическом уровне синтаксис, такой как np.copy, позволяет избежать ошибок при столкновении имен. Это причудливый способ сослаться на проблемы, с которыми вы столкнулись, когда случайно использовали numpy.ma.core.copy, когда намеревались использовать numpy.copy. Многие из функций и методов в Numpy имеют очень общие имена (copy, min, max и т. Д.), Что делает их чрезвычайно подверженными ошибкам столкновения. Кроме того, как вы уже знаете, многие функции с одинаковыми именами присутствуют как в пакете верхнего уровня numpy, так и в других местах Numpy, например, numpy.ma.core. Единственным хорошим способом решения этой проблемы является синтаксис в стиле np.copy.

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