python - 类型检查器警告 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 个非常糟糕的解决方案:
- 关闭类型检查器。这显然是不可取的。
- 删除类型注释。这删除了我的代码中的一些但不是全部的此类警告。缺点是它删除了有用且正确的类型注释。
- 使类型注释错误。也就是说,当我真正返回 IntFlag 子类型时,假设我正在返回“int”。最好根本没有类型注释。
现在我选择 2 号。
解决方案
推荐阅读
- c# - 作为原生 Android 服务运行的 C# 应用程序
- treeview - Outsystems:来自数据库数据/列表的动态树视图
- laravel-5 - $faker->word 如何获得独特的价值?
- python - 在 python 中,为什么程序不让我从用户那里导入数据
- php - 哪个最好的工具 PHP 要么 Bootstrap。?
- java - 如何打印 javax.xml.validation.Schema?
- javascript - 如何获取firestore子集合中的所有文档
- android - 如何为 Android 编译 LLVM/Clang?
- angular - 如何将三元值传递给角度变量?
- c# - 重构方法 (C#)