Skip to content

Infinite recursion with get_type_hints #667

Description

@vg0377467

I encountered one condition where calling get_type_hints causes infinite recursion when dealing with forward declaration and cyclic types.

Here's an example:

from typing import Union, List, get_type_hints

ValueList = List['Value']
Value = Union[str, ValueList]

class A:
    a: List[Value]

get_type_hints(A, globals(), locals())

This reaches the recursion limit as of 3.8.0b2.

It seems that the combining _GenericAlias with ForwardRef is what triggers this condition:

  • ForwardRef._evaluate sets __forward_value__ on its first call on a given instance
  • _GenericAlias tries to compare its args post evaluation
    If one of the arguments is a previously evaluated forward reference containing a cycle, then it will infinitely recurse in the hash function when building a frozen set for the comparison.

The above is, of course, a very artificial example, but I can imagine this happening a lot in code with trees or similar structures.
My initial reproduction case was using _eval_type to resolve forward references returned by get_args (side note: it would be nice to have a public function to do that).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions