Как сделать автоимпорт pycharm из numpy, а не numpy.ma.core?

1

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

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

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

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

Кто-нибудь?

Изображение 174551

  • 1
    Пакет numpy импортирует многие базовые объекты в свой __init__.py чтобы их можно было легко импортировать оттуда. Оригинал сопротивляется в одном из подмодулей, таких как numpy.ma.core . Pycharm (как и другие IDE) предпочитает импортировать оригинал. Там может быть только один оригинал, но много импорта в другие модули.
  • 0
    Но могу ли я изменить это поведение Pycharm? Я не хочу проверять, какой из списка мне следует использовать. Я просто хочу использовать по умолчанию один из NumPy.
Показать ещё 4 комментария
Теги:
numpy
pycharm

1 ответ

0

Эта проблема"

numpy.lib.function_base.copy функция фактически указана в отображаемом окне автозаполнения и называется 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(...)

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

  • Дзен Питона говорит нам

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

    Использование в вашем коде, например, 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.

  • 0
    О, я знаю, что могу использовать import numpy as np , но, как я уже сказал, мне это не нравится, потому что я думаю, что читать это раздражает.
  • 0
    Функция копирования экспортируется в верхний уровень пустого пространства имен в __init__ в исходном коде через from .lib import * . Я бы хотел, чтобы PyCharm создавал импорт, используя только numpy , а не numpy.anythingelse (получение оригиналов). Я не хочу делать эту проверку для каждой функции, которую я буду использовать. У меня была проблема, потому что он использовал ma.ones, а не тот, который используется, когда я делаю np.ones . Который я даже не уверен, какой это: numpy.core.numeric или numpy.matlib ? Есть идеи, как это сделать?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню