【问题标题】:PyCharm getitem warning for functions with arrays带有数组的函数的 PyCharm getitem 警告
【发布时间】:2015-06-05 02:41:59
【问题描述】:

我收到来自 PyCharm 的代码检查警告。我理解逻辑,但我不清楚修复它的适当方法。假设我有以下示例函数:

def get_ydata(xdata):
    ydata = xdata ** 2
    for i in range(len(ydata)):
        print ydata[i]
return ydata

我收到 2 个警告:

>> Expected type 'Sized', got 'int' instead (at line 3)
>> Class 'int' does not define '__getitem__', so the '[]' operator cannot be used on its instances (at line 4)

函数的目的当然是解析一个numpy的xdata数组。但是 PyCharm 不知道这一点,所以没有任何进一步的说明假设 xdata(因此也是 ydata)是一个整数。

解决此警告的适当方法是什么?我应该注意,添加类型检查行将修复警告。那是最佳解决方案吗?例如:

if not type(ydata) is np.ndarray:
    ydata = np.array(ydata)

最后,添加 Sphinx 文档字符串信息似乎对警告没有任何影响。 (当 xdata 指定为 str 时,警告仍然显示为 'int')。同样迭代 y 直接导致以下错误:

for y in ydata:
...
>> Expected 'collections.Iterable', got 'int' instead

【问题讨论】:

  • 为什么不直接遍历ydata?另外,请注意,您可以使用 Sphinx 标记告诉 PyCharm 参数是什么:jetbrains.com/pycharm/help/creating-documentation-comments.html
  • 至于样式,我有理由使用基于索引的方法,而不是直接迭代 ydata。除此之外,我刚刚检查了一下,基于 Sphinx 的文档字符串似乎对警告没有任何影响。例如,将 xdata 指定为 str,仍然会导致相同的“预期 int”错误,因此它似乎没有被考虑在内。此外,直接迭代 ydata 只会导致以下错误:“预期的 'collections.Iterable',得到了 'int'”。我会相应地更新我的问题
  • 请记住,您的选择之一就是忽略它 - 毕竟这只是一个警告。
  • PyCharm 非常聪明,我也使用了很多数组操作,这些误报有时很烦人,因为它们隐藏了真正的问题。我敢肯定,如果您创建一个问题,他们会修复它,但它已经每天都得到很大改进。

标签: python numpy iterator pycharm


【解决方案1】:

TL;DR 使用 list() 投射它

晚了,还是,

我对其他一些代码也有类似的问题。

我可以通过类似的方法解决它

def get_ydata(xdata):
    ydata = list(xdata ** 2)
    for i in range(len(ydata)):
        print ydata[i]
    return ydata

考虑accepted answer。对我的回答的评论是有效的。

【讨论】:

  • 除非有理由将数组转换为列表,否则类型注释是正确的解决方案。我们不应该仅仅为了让编辑器静音而复制内存并创建新的数据对象
  • 要跟进 Vince 的评论,您最好使用 PyCharm 的内置命令之一(例如 # noqa 尽管可能过于宽泛)来隐藏错误(没有运行时错误)。至少那时阅读代码的人可以看到做出了读取 linter 错误的深思熟虑的决定。
【解决方案2】:

Pycharm 具有可能有用的type hinting 功能。

例如在这种情况下,以下代码使错误消失:

import numpy as np

def get_ydata(xdata):
    ydata = xdata ** 2  # type: np.ndarray
    for i in range(len(ydata)):
        print(ydata[i])
    return ydata

最近的 python 版本还包括对type annotations的支持

import numpy as np
def get_ydata(xdata: np.ndarray):
    ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 2018-12-22
    • 2011-03-27
    • 1970-01-01
    • 2012-09-05
    • 2016-02-17
    • 1970-01-01
    相关资源
    最近更新 更多