Skip to content

Unioned types should be hashable: not documented? #112281

Closed

Description

@faph

Documentation

It seems that typing.Union[X, Y] as well as X | Y type hints require X and Y to be hashable.

This is not documented as far as I can see.

Considering this example:

@dataclass
class ValueRange:
    lo: int
    hi: int

T1 = Annotated[int, ValueRange(-10, 5)]

This fails when unioned:

>>> Annotated[int, ValueRange(-10, 5)] | None
(...)
  File "/usr/lib64/python3.11/typing.py", line 1375, in __or__
    return Union[self, right]
           ~~~~~^^^^^^^^^^^^^
  File "/usr/lib64/python3.11/typing.py", line 358, in inner
    return func(*args, **kwds)
           ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib64/python3.11/typing.py", line 481, in __getitem__
    return self._getitem(self, parameters)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib64/python3.11/typing.py", line 695, in Union
    parameters = _remove_dups_flatten(parameters)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib64/python3.11/typing.py", line 326, in _remove_dups_flatten
    return tuple(_deduplicate(params))
                 ^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib64/python3.11/typing.py", line 301, in _deduplicate
    all_params = set(params)
                 ^^^^^^^^^^^
  File "/usr/lib64/python3.11/typing.py", line 2151, in __hash__
    return hash((self.__origin__, self.__metadata__))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: unhashable type: 'ValueRange'

Should this be documented say here: https://docs.python.org/3/library/typing.html?highlight=typing#typing.Annotated ?

And examples here should use frozen dataclasses: https://docs.python.org/3/library/typing.html?highlight=typing#typing.Annotated ?

Linked PRs

Activity

  1. added
    docsDocumentation in the Doc dir
    on Nov 20, 2023
  2. sobolevn commented on Nov 20, 2023

    @sobolevn
    Member

    PEPs https://peps.python.org/pep-0593/#specification and https://peps.python.org/pep-0604/ do not say anything about requirement of items to be hashable. I think that this is a bug: unhashable items must be allowed.

    I think that we need to rework our _deduplicate function. I have an idea on how to do it :)

    Thanks for the report! 👍

  3. added
    type-bugAn unexpected behavior, bug, or error
    and removed
    docsDocumentation in the Doc dir
    on Nov 20, 2023
  4. self-assigned this
    on Nov 20, 2023
  5. sobolevn commented on Nov 20, 2023

    @sobolevn
    Member

    This is more complex than I initially thought, because _UnionGenericAlias also uses set to compare results. So, we need a slow way of doing it as well. See

    return set(self.__args__) == set(other.__args__)

  6. added a commit that references this issue on Nov 20, 2023
  7. added a commit that references this issue on Mar 1, 2024
  8. added a commit that references this issue on Mar 1, 2024
  9. added a commit that references this issue on Mar 1, 2024
  10. added a commit that references this issue on Mar 3, 2024
  11. added a commit that references this issue on Mar 3, 2024
  12. added a commit that references this issue on Mar 4, 2024
  13. added a commit that references this issue on Mar 25, 2024
  14. added a commit that references this issue on Apr 17, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions