Message349330
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). |
|
Date |
User |
Action |
Args |
2019-08-10 05:26:57 | vg0377467 | set | recipients:
+ vg0377467 |
2019-08-10 05:26:57 | vg0377467 | set | messageid: <1565414817.02.0.248356075738.issue37806@roundup.psfhosted.org> |
2019-08-10 05:26:56 | vg0377467 | link | issue37806 messages |
2019-08-10 05:26:56 | vg0377467 | create | |
|