Я использую несколько простых функций и для удобства чтения я предпочитаю импортировать их одну за другой, а не импортировать как np.
Я использую pycharm IDE, и он автоматически предлагает импортировать из numpy.ma.core, а не просто из numpy.
В прошлом у меня были проблемы с использованием замаскированных массивов: он не выдавал ошибку, когда это должно было произойти, и я не знал, что использую замаскированные массивы из-за этого автоимпорта из pycharm. Поэтому я хочу избегать использования библиотеки, но был бы рад, если бы Pycharm все еще мог выполнять импорт автоматически для меня, а не для того, чтобы я делал это вручную в верхней части кода.
Вот пример функции copy из numpy. Pycharm предлагает импортировать из numpy.ma.core, я хотел бы предложить просто numpy.
Кто-нибудь?
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
.
import numpy as np
, но, как я уже сказал, мне это не нравится, потому что я думаю, что читать это раздражает.
__init__
в исходном коде через from .lib import *
. Я бы хотел, чтобы PyCharm создавал импорт, используя только numpy
, а не numpy.anythingelse
(получение оригиналов). Я не хочу делать эту проверку для каждой функции, которую я буду использовать. У меня была проблема, потому что он использовал ma.ones, а не тот, который используется, когда я делаю np.ones
. Который я даже не уверен, какой это: numpy.core.numeric
или numpy.matlib
? Есть идеи, как это сделать?
numpy
импортирует многие базовые объекты в свой__init__.py
чтобы их можно было легко импортировать оттуда. Оригинал сопротивляется в одном из подмодулей, таких какnumpy.ma.core
. Pycharm (как и другие IDE) предпочитает импортировать оригинал. Там может быть только один оригинал, но много импорта в другие модули.