首页 > 解决方案 > 类型检查器警告 IntFlag 按位运算结果为 int

问题描述

编辑:这现在被归类为 PyCharm 中的错误。
错误报告链接:https ://youtrack.jetbrains.com/issue/PY-46247

PyCharm 的类型检查器无法识别 IntFlag 实例上的按位操作仍然是 IntFlags。它给出警告(在下面的评论中内联)。python 文档说,“可以使用按位运算符(&、|、^、~)组合 IntFlag 成员,结果仍然是 IntFlag 成员。” 当我运行它时,代码运行良好。

如何在不关闭它的情况下满足所有这些情况的类型检查器?

from enum import IntFlag

class Foo(IntFlag):
    bar = 1,
    baz = 2,
    bog = 4

    def complement(self):
        return 7 & ~self


def doit(flag1: Foo, flag2: Foo) -> Foo:
    return flag1 | flag2  # warning: "Expected type 'Foo', got 'int' instead."


def doitagain(flag1: Foo, flag2: Foo) -> Foo:
    return (flag1 | flag2).complement()   # warning: "Unresolved attribute reference 'complement' for class 'int'"


print(doit(Foo.bar, Foo.baz))  # prints: "Foo.baz|bar"  (as expected)

print(doitagain(Foo.bar, Foo.baz))  # prints: "Foo.bog"  (as expected)

编辑:我想到了 3 个非常糟糕的解决方案:

  1. 关闭类型检查器。这显然是不可取的。
  2. 删除类型注释。这删除了我的代码中的一些但不是全部的此类警告。缺点是它删除了有用且正确的类型注释。
  3. 使类型注释错误。也就是说,当我真正返回 IntFlag 子类型时,假设我正在返回“int”。最好根本没有类型注释。

现在我选择 2 号。

标签: pythonpycharm

解决方案


推荐阅读