如何从numpy而不是numpy.ma.core中创建pycharm autoimport?

问题描述 投票:1回答:1

我使用了几个numpy函数,为了便于阅读,我更喜欢逐个导入它们而不是导入为np。

我使用pycharm IDE,它会自动建议从numpy.ma.core导入,而不仅仅是numpy。

我在过去使用屏蔽数组时遇到了问题:当我期待它时它没有引发错误,而且我没有意识到我使用了屏蔽数组,因为pycharm的这个自动导入。所以我想避免使用该库,但如果Pycharm仍然可以自动为我执行导入,而不是我必须在代码的顶部手动执行它们,我会很高兴。

这是一个函数副本的例子,来自numpy。 Pycharm建议从numpy.ma.core导入,我希望它建议只是numpy。

任何人?

Autocomplete in Pycharm

python numpy pycharm
1个回答
1
投票

The "problem"

您想要的功能实际上列在您显示的自动完成框中,它是numpy.lib.function_base.copy。您可以通过以下assert证明这一点:

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

命名空间混淆的原因是numpy.copy函数实际上确实是defined in numpy.lib.function_base(链接到源)。然后通过Numpy源代码中顶级numpy.lib.function_base.copy文件中的代码将numpy导出到顶级__init__.py命名空间。因此,Pycharm正在copynumpy.lib.function_base.copy的原始定义,而不是numpy.copy的别名。

A better fix

从最强的角度来说,我建议您在代码中切换到使用如下语法:

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中的许多函数和方法都有非常通用的名称(copyminmax等),使它们极易发生碰撞错误。此外,正如您所经历的那样,许多具有相同名称的函数都存在于顶级numpy包和Numpy中的其他地方,例如numpy.ma.core。处理这个问题的唯一好方法是np.copy样式语法。
© www.soinside.com 2019 - 2024. All rights reserved.