Skip to content

Mypy doesn't catch unhashable literals in hashdependant literals. #8150

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
mental32 opened this issue Dec 15, 2019 · 2 comments
Closed

Mypy doesn't catch unhashable literals in hashdependant literals. #8150

mental32 opened this issue Dec 15, 2019 · 2 comments

Comments

@mental32
Copy link

context on the python-dev mailing list

As per Guido and Nicks suggestions I am opening this issue here :D

"""foo bar."""

from typing import Set, Dict

SOME = {{0}}
print(SOME)


def green_eggs() -> Set[Set[int]]:
    """foo."""
    return {{1}}


def and_ham() -> Dict[Set[int], int]:
    """bar."""
    return {{1}: 0}

Mypy reports this as fine with no errors.
It should detect and throw when encountering {{1}: 0} or Dict[Set[int], int] or {{1}} or {[1]} since these are literals whose types are not hashable therefore they may not be used in types that require members be hashable i.e. Dict or Set.

I'm using mypy 0.750 and Python 3.8.0 (default, Oct 23 2019, 18:51:26) [GCC 9.2.0] on linux

If needed I'm happy to attempt to PR this myself :)

@JelleZijlstra
Copy link
Member

This is basically a duplicate of #2455, although the example in this issue is a bit more foundational.

The reason why this has been open for so long is that the hashability protocol in Python behaves a bit weirdly: all objects are hashable by default, except that certain objects explicitly mark themselves as not hashable. Catching this sort of thing in mypy probably requires some special casing.

@ilevkivskyi
Copy link
Member

Yeah, I think this is a dupe.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants