«проблема»
Требуемая функция фактически указана в отображаемом окне автозаполнения, и это 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
.