【问题标题】:How to deal with PyCharm's "Expected type X, got Y instead"如何处理 PyCharm 的“预期类型 X,得到 Y”
【发布时间】:2018-01-22 01:46:45
【问题描述】:

使用 PyCharm 时,如果我写 np.array(0.0),Pycharm 的代码样式检查会在编辑器中给我警告 Expected type 'Union[ndarray, Iterable]', got 'float' instead。当我写 np.array([0.0]) 时,我没有收到任何警告。

编码时

from scipy.special import expit
expit(0.0)

我得到Expected type 'ndarray', got 'float' instead,而

expit(np.array([0.0]))

解决了。

我认为 Pycharm 的代码风格检查想要告诉我的是存在类型错误的可能性,但我不确定从良好编程的意义上我应该如何应对。 PyCharm 骂我是对的吗?我应该使用长版本还是应该保留短版本以提高可读性和编码速度?

如果我不应该将我的代码更改为长版本 - 我可以摆脱 Pycharm 的代码样式检查警告吗,或者这是一个坏主意,因为它们在其他情况下可能是正确的,我无法调整具体是什么警告?

【问题讨论】:

  • 函数 expit 需要一个 array(list) ,所以当你传递浮点数 0.0 你会得到错误。
  • @Stack:我没有收到错误消息。只有来自 PyCharm 的警告。如果你真的运行expit(0.0),你既不会得到错误,也不会得到警告,只会得到结果。
  • 我认为是修改代码还是忽略/禁用警告的问题主要取决于品味和个人喜好。

标签: python numpy pycharm


【解决方案1】:

PyCharm 根据源代码的类型提示确定您传递的参数不正确。


如何禁用

您的问题简化为弄清楚如何禁用此类型检查。但是,请注意,

完全关闭检查不是一个好的解决方案。最多 PyCharm 做对了,这提供了有用的反馈。 如果弄错了,最好跟他们提票看看 如果可以解决的话。

你可以这样做:

  1. 转到Settings/Preferences

  2. 在侧边栏,点击Inspections

  3. 展开Python 标签

  4. 向下滚动到Type Checker 并取消选中它

PyCharm 现在应该停止发出有关不正确函数参数的警告。

【讨论】:

  • 不起作用。在 PyCharm 2019.1.2(社区版)上测试。
  • 如果这对某人仍然有用:要取消选中的标签是 Type checker 而不是 Incorrect Call Arguments
  • 完全关闭检查不是一个好的解决方案。大多数情况下,PyCharm 都是正确的,这提供了有用的反馈。如果弄错了,最好跟他们提个票,看看能不能修好。
  • @jon_two 我只是在回答他们的“我可以摆脱 Pycharm 的代码样式检查警告吗”,但我同意您的免责声明,并将其添加到答案中。谢谢
【解决方案2】:

查看specifications of the expit function。没有说允许提供标量参数 - 它需要numpy.ndarray。 PyCharm 足够聪明,可以告诉您任何可迭代的(因此是列表)都是可接受的,但此消息不是警告 - 它告诉您编写的代码不符合函数的规范。正如@JonClements 在评论中指出的那样,numpy 的标量广播功能将允许此代码运行,但 PyCharm 不够聪明,无法推断出这一点。

注意:@cs95 的答案解释了如何禁用类型检查,它可能更适合作为接受的答案。

【讨论】:

  • 有趣的是,它在运行时不会抛出错误。我的猜测是脚本隐式转换它。
  • expit(0) 返回结果,但没有任何警告或错误
  • @COLDSPEED:它可能不会抛出错误,但这并不意味着它是好的代码。得到你想要的结果?很好:忽略警告,但你是在自找麻烦,因为文档不能保证在未来的版本中不会排除这种行为......
  • @Make42 expit 是一个 ufunc,它会根据需要进行广播 - 尽管 PyCharm 不知道标量 可能 是有效的(无论它实际上是否正确/可取对于expit 本身 - 我不知道),所以它只能根据类型提示发出警告......
【解决方案3】:

如果您想忽略该特定行,

那么你就可以放

# noinspection PyTypeChecker

在被标记的代码行之上。

【讨论】:

    【解决方案4】:

    正如@brunodd 之前在评论中所说,要取消选中的正确标签是Type checker

    • 转到Settings/Preferences (Ctrl + Alt + S)
    • 在侧边栏Inspections
    • Python标签
    • 取消选中Type Checker并点击Apply

    这真的很烦人,PyCharm 无法识别某些类型,即使它是正确的。

    【讨论】:

      猜你喜欢
      • 2017-01-19
      • 2021-01-18
      • 2015-08-14
      • 2015-01-02
      • 2020-07-21
      • 2018-03-28
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      相关资源
      最近更新 更多