更新 此问题已在 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总是int或float(并且 PyCharm 将其理解为got Union[int, float]在上述警告中很明显)。
那么,这是 PyCharm 中的一个错误,在这个特定用例中它无法看到int并float执行__div__,还是我在这里遗漏了其他东西?
更新
奇怪的是,如果foo修改为return x * 60 * 60警告消失,PyCharm 不会警告x不执行__mul__.
更新 2
更改foo为return float(x) / (60 * 60)显然会使警告消失,但x已被警告本身推断为int或float显而易见。
绝对看起来像是 PyCharm 中的一个错误。