Search code examples
pythonpycharmpython-typing

Parameterized generics cannot be used with class or instance checks


I wrote the code, but I get the following message in pycharm(2019.1): "Parameterized generics cannot be used with class or instance checks"

    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)

I really do not understand this message well. Did I do something wrong or is it a bug in pycharm? The error disappears if I explicitly typecast to tuple.

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

screenshot


Solution

  • That looks like a bug in pycharm where it's a bit overeager in assuming that you're using the typing module in an unintended way. See this example here where that assumption would have been correct:

    enter image description here

    The classes in the typing module are only useful in a type annotation context, not to inspect or compare to actual classes, which is what isinstance tries to do. Since pycharm sees a simple object with square brackets that do not contain a literal, it jumps to the wrong conclusion you are seeing.

    Your code is fine, you can use it exactly as it is.