diff --git a/Lib/typing.py b/Lib/typing.py index 5f1a0ad3d637430..52553eeb7b9a0a5 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -491,7 +491,7 @@ class ForwardRef(_Final, _root=True): __slots__ = ('__forward_arg__', '__forward_code__', '__forward_evaluated__', '__forward_value__', - '__forward_is_argument__') + '__forward_is_argument__', '__hash') def __init__(self, arg, is_argument=True): if not isinstance(arg, str): @@ -505,6 +505,7 @@ def __init__(self, arg, is_argument=True): self.__forward_evaluated__ = False self.__forward_value__ = None self.__forward_is_argument__ = is_argument + self.__hash = None def _evaluate(self, globalns, localns): if not self.__forward_evaluated__ or localns is not globalns: @@ -528,7 +529,9 @@ def __eq__(self, other): self.__forward_value__ == other.__forward_value__) def __hash__(self): - return hash((self.__forward_arg__, self.__forward_value__)) + if self.__hash is None: + self.__hash = hash((self.__forward_arg__, self.__forward_value__)) + return self.__hash def __repr__(self): return f'ForwardRef({self.__forward_arg__!r})' diff --git a/Misc/NEWS.d/next/Library/2019-08-26-02-29-14.bpo-37806.wR83qu.rst b/Misc/NEWS.d/next/Library/2019-08-26-02-29-14.bpo-37806.wR83qu.rst new file mode 100644 index 000000000000000..50853efd7ace405 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-08-26-02-29-14.bpo-37806.wR83qu.rst @@ -0,0 +1 @@ +Fix infinite recursion from :func:`typing.get_type_hints`. Patch by hongweipeng.