@@ -1505,6 +1505,65 @@ def test_forward_equality(self):
1505
1505
self .assertEqual (fr , typing .ForwardRef ('int' ))
1506
1506
self .assertNotEqual (List ['int' ], List [int ])
1507
1507
1508
+ def test_forward_equality_gth (self ):
1509
+ c1 = typing .ForwardRef ('C' )
1510
+ c1_gth = typing .ForwardRef ('C' )
1511
+ c2 = typing .ForwardRef ('C' )
1512
+ c2_gth = typing .ForwardRef ('C' )
1513
+
1514
+ class C :
1515
+ pass
1516
+ def foo (a : c1_gth , b : c2_gth ):
1517
+ pass
1518
+
1519
+ self .assertEqual (get_type_hints (foo , globals (), locals ()), {'a' : C , 'b' : C })
1520
+ self .assertEqual (c1 , c2 )
1521
+ self .assertEqual (c1 , c1_gth )
1522
+ self .assertEqual (c1_gth , c2_gth )
1523
+ self .assertEqual (List [c1 ], List [c1_gth ])
1524
+ self .assertNotEqual (List [c1 ], List [C ])
1525
+ self .assertNotEqual (List [c1_gth ], List [C ])
1526
+ self .assertEquals (Union [c1 , c1_gth ], Union [c1 ])
1527
+ self .assertEquals (Union [c1 , c1_gth , int ], Union [c1 , int ])
1528
+
1529
+ def test_forward_equality_hash (self ):
1530
+ c1 = typing .ForwardRef ('int' )
1531
+ c1_gth = typing .ForwardRef ('int' )
1532
+ c2 = typing .ForwardRef ('int' )
1533
+ c2_gth = typing .ForwardRef ('int' )
1534
+
1535
+ def foo (a : c1_gth , b : c2_gth ):
1536
+ pass
1537
+ get_type_hints (foo , globals (), locals ())
1538
+
1539
+ self .assertEqual (hash (c1 ), hash (c2 ))
1540
+ self .assertEqual (hash (c1_gth ), hash (c2_gth ))
1541
+ self .assertEqual (hash (c1 ), hash (c1_gth ))
1542
+
1543
+ def test_forward_equality_namespace (self ):
1544
+ class A :
1545
+ pass
1546
+ def namespace1 ():
1547
+ a = typing .ForwardRef ('A' )
1548
+ def fun (x : a ):
1549
+ pass
1550
+ get_type_hints (fun , globals (), locals ())
1551
+ return a
1552
+
1553
+ def namespace2 ():
1554
+ a = typing .ForwardRef ('A' )
1555
+
1556
+ class A :
1557
+ pass
1558
+ def fun (x : a ):
1559
+ pass
1560
+
1561
+ get_type_hints (fun , globals (), locals ())
1562
+ return a
1563
+
1564
+ self .assertEqual (namespace1 (), namespace1 ())
1565
+ self .assertNotEqual (namespace1 (), namespace2 ())
1566
+
1508
1567
def test_forward_repr (self ):
1509
1568
self .assertEqual (repr (List ['int' ]), "typing.List[ForwardRef('int')]" )
1510
1569
@@ -1524,6 +1583,63 @@ def foo(a: Tuple['T']):
1524
1583
self .assertEqual (get_type_hints (foo , globals (), locals ()),
1525
1584
{'a' : Tuple [T ]})
1526
1585
1586
+ def test_forward_recursion_actually (self ):
1587
+ def namespace1 ():
1588
+ a = typing .ForwardRef ('A' )
1589
+ A = a
1590
+ def fun (x : a ): pass
1591
+
1592
+ ret = get_type_hints (fun , globals (), locals ())
1593
+ return a
1594
+
1595
+ def namespace2 ():
1596
+ a = typing .ForwardRef ('A' )
1597
+ A = a
1598
+ def fun (x : a ): pass
1599
+
1600
+ ret = get_type_hints (fun , globals (), locals ())
1601
+ return a
1602
+
1603
+ def cmp (o1 , o2 ):
1604
+ return o1 == o2
1605
+
1606
+ r1 = namespace1 ()
1607
+ r2 = namespace2 ()
1608
+ self .assertIsNot (r1 , r2 )
1609
+ self .assertRaises (RecursionError , cmp , r1 , r2 )
1610
+
1611
+ def test_union_forward_recursion (self ):
1612
+ ValueList = List ['Value' ]
1613
+ Value = Union [str , ValueList ]
1614
+
1615
+ class C :
1616
+ foo : List [Value ]
1617
+ class D :
1618
+ foo : Union [Value , ValueList ]
1619
+ class E :
1620
+ foo : Union [List [Value ], ValueList ]
1621
+ class F :
1622
+ foo : Union [Value , List [Value ], ValueList ]
1623
+
1624
+ self .assertEqual (get_type_hints (C , globals (), locals ()), get_type_hints (C , globals (), locals ()))
1625
+ self .assertEqual (get_type_hints (C , globals (), locals ()),
1626
+ {'foo' : List [Union [str , List [Union [str , List ['Value' ]]]]]})
1627
+ self .assertEqual (get_type_hints (D , globals (), locals ()),
1628
+ {'foo' : Union [str , List [Union [str , List ['Value' ]]]]})
1629
+ self .assertEqual (get_type_hints (E , globals (), locals ()),
1630
+ {'foo' : Union [
1631
+ List [Union [str , List [Union [str , List ['Value' ]]]]],
1632
+ List [Union [str , List ['Value' ]]]
1633
+ ]
1634
+ })
1635
+ self .assertEqual (get_type_hints (F , globals (), locals ()),
1636
+ {'foo' : Union [
1637
+ str ,
1638
+ List [Union [str , List ['Value' ]]],
1639
+ List [Union [str , List [Union [str , List ['Value' ]]]]]
1640
+ ]
1641
+ })
1642
+
1527
1643
def test_callable_forward (self ):
1528
1644
1529
1645
def foo (a : Callable [['T' ], 'T' ]):
0 commit comments