【问题标题】:How do I make pycharm autoimport from numpy rather than numpy.ma.core?如何从 numpy 而不是 numpy.ma.core 进行 pycharm 自动导入?
【发布时间】:2019-06-07 11:44:01
【问题描述】:

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

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

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

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

有人吗?

【问题讨论】:

  • numpy 包将许多底层对象导入其__init__.py,因此可以方便地从那里导入它们。原版在numpy.ma.core 等子模块之一中抗拒。 Pycharm(与其他 IDE 一样)更喜欢导入原始版本。只能有一个原始的,但可以有许多导入到其他模块中。
  • 但是我可以改变 Pycharm 的这种行为吗?我不想检查我应该使用哪个列表。我只想使用 numpy 中的默认值。
  • 没有“默认的”只有“原始的”。什么技术属性会使它成为“默认”?
  • 如果我执行 np.function 将使用的那个。
  • IDE 应该如何知道你会做什么?它无法为您读取 numpy 文档。

标签: python numpy pycharm


【解决方案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.lib.function_base.copy 通过 Numpy 源中顶级 __init__.py 文件中的代码导出到顶级 numpy 命名空间。因此,Pycharm 在 numpy.lib.function_base.copy 处使用 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.copy 时,您不小心使用了numpy.ma.core.copy,这是指您遇到的那种问题的一种奇特方式。 Numpy 中的许多函数和方法都有非常通用的名称(copyminmax 等),这使得它们极易发生碰撞错误。此外,正如您所经历的那样,顶级numpy 包和Numpy 的其他地方都存在许多具有相同名称的函数,例如numpy.ma.core。处理此问题的唯一好方法是 np.copy 样式语法。

【讨论】:

  • 哦,我知道我可以使用import numpy as np,但正如我所说,我不喜欢它,因为我觉得它读起来很烦人。
  • 复制函数通过from .lib import *导出到源码中__init__中的numpy命名空间顶层。我希望 PyCharm 仅使用 numpy 而不是 numpy.anythingelse 创建导入(获取原件)。我不想检查我将使用的每个功能。我遇到了一个问题,因为它使用的是 ma.ones,而不是我做 np.ones 时使用的那个。我什至不确定是哪一个:numpy.core.numericnumpy.matlib?关于如何做到这一点的任何想法?
  • @HomeroEsmeraldo 你找到解决这个导入问题的方法了吗?
  • 很遗憾没有。我大部分时间都只是在顶部手动编写我的导入。喜欢from numpy import functionineed。如果你发现更好的东西,请告诉我。在 pycharm/jetbrains 上提问可能会很有成效。他们在其他方面帮助了我,但在这种情况下我没有走这条路。
猜你喜欢
  • 2019-09-13
  • 1970-01-01
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 2021-01-10
相关资源
最近更新 更多