如何使pycharm从numpy而不是numpy.ma.core自动导入?

时间:2019-01-13 01:29:47

标签: python numpy pycharm

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

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

过去我在使用掩码数组时遇到了问题:当我期望它不会出现错误时,并且由于从pycharm自动导入而没有意识到自己在使用掩码数组。因此,我想避免使用该库,但很高兴Pycharm仍然可以为我自动进行导入,而不必在代码顶部手动进行导入。

这是numpy中的函数副本的示例。 Pycharm建议从numpy.ma.core导入,我希望仅建议numpy。

有人吗?

Autocomplete in Pycharm

1 个答案:

答案 0 :(得分:1)

“问题”

所需的功能实际上在显示的自动完成框中列出,并且为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上的别名。

更好的解决方法

最强烈的建议是,建议您在代码中使用以下语法:

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样式语法。

相关问题