参数化泛型不能与类或实例检查一起使用

问题描述 投票:0回答:4

我编写了代码,但在 pycharm(2019.1) 中收到以下消息: “参数化泛型不能与类或实例检查一起使用”

    def data_is_valid(data):
        keys_and_types = {
            'comment': (str, type(None)),
            'from_budget': (bool, type(None)),
            'to_member': (int, type(None)),
            'survey_request': (int, type(None)),
        }

        def type_is_valid(test_key, test_value):
            return isinstance(test_value, keys_and_types[test_key])

        type_is_valid('comment', 3)

我实在不太明白这个消息。是我做错了什么还是pycharm的bug? 如果我明确类型转换为元组,错误就会消失。

def type_is_valid(test_key, test_value):
    return isinstance(test_value, tuple(keys_and_types[test_key]))

screenshot

python pycharm python-typing
4个回答
44
投票

这看起来像是 pycharm 中的一个错误,它有点过于热切地假设您正在以意想不到的方式使用

typing
模块。请参阅此处的示例,其中该假设是正确的:

enter image description here

typing
模块中的类仅在类型注释上下文中有用,而不是检查或与实际类进行比较,而这正是
isinstance
试图做的事情。由于 pycharm 看到一个带有方括号且不包含文字的简单对象,因此它会跳转到您所看到的错误结论。

你的代码很好,你可以直接使用它。


2
投票

这是 PyCharm 2018 中的一个已知错误,报告于 here

最近的 PyCharm 版本中仍然存在一些相关的错误,例如PyCharm 2021.2.2,这里

一般来说,当您发现某些 PyCharm 警告不正确时,我会首先隔离一个简单的测试用例,这样可以更清楚地了解 PyCharm 实际上不正确的内容。当很明显 PyCharm 的警告有误时,您应该始终填写有关它的错误报告(或者首先搜索现有的错误报告)。这里很清楚,因为 PyCharm 说你不能做某事,而实际上你可以,所以某事是错误的。


2
投票

我不会跟别人重复说这是一个 pycharm bug。如果你是一个完美主义者,错误伤害了你的眼睛,请添加评论

# noqa

到“错误”所在的行


1
投票

既然它被认为是一个错误,你可以通过以下行在 Pycharm 中抑制它:

# noinspection PyTypeHints
© www.soinside.com 2019 - 2024. All rights reserved.