PyCharm 认为 int / float 没有实现 __div__ 的那一天

Dee*_*ace 5 python pycharm

更新 此问题已在 PyCharm 2017.2 中解决

def foo(x):
    return x / (60 * 60)

z = 1
y = 2
bar = 0 if y == 0 else z / y

foo(bar)
Run Code Online (Sandbox Code Playgroud)

这导致 PyCharm 2017.1.4 具有几乎默认的分析器设置(我相信)显示以下警告:

预期类型'{__div__}',而是得到 'Union[int, float]'。

此检查检测函数调用表达式中的类型错误。由于动态调度和鸭子类型,这在有限但有用的情况下是可能的

现在,当然 Python 没有静态类型检查,但很明显,这里bar总是intfloat(并且 PyCharm 将其理解为got Union[int, float]在上述警告中很明显)。

那么,这是 PyCharm 中的一个错误,在这个特定用例中它无法看到intfloat执行__div__,还是我在这里遗漏了其他东西?

更新

奇怪的是,如果foo修改为return x * 60 * 60警告消失,PyCharm 不会警告x不执行__mul__.

更新 2

更改fooreturn float(x) / (60 * 60)显然会使警告消失,但x已被警告本身推断为intfloat显而易见。

绝对看起来像是 PyCharm 中的一个错误。

小智 1

这似乎是你的PyCharm版本的一个错误,我无法在2017.1.2重现它

编辑:你使用哪个Python编译器?2.7x 还是 3.x?