@@ -2361,6 +2361,65 @@ def test_forward_equality(self):
2361
2361
self .assertEqual (fr , typing .ForwardRef ('int' ))
2362
2362
self .assertNotEqual (List ['int' ], List [int ])
2363
2363
2364
+ def test_forward_equality_gth (self ):
2365
+ c1 = typing .ForwardRef ('C' )
2366
+ c1_gth = typing .ForwardRef ('C' )
2367
+ c2 = typing .ForwardRef ('C' )
2368
+ c2_gth = typing .ForwardRef ('C' )
2369
+
2370
+ class C :
2371
+ pass
2372
+ def foo (a : c1_gth , b : c2_gth ):
2373
+ pass
2374
+
2375
+ self .assertEqual (get_type_hints (foo , globals (), locals ()), {'a' : C , 'b' : C })
2376
+ self .assertEqual (c1 , c2 )
2377
+ self .assertEqual (c1 , c1_gth )
2378
+ self .assertEqual (c1_gth , c2_gth )
2379
+ self .assertEqual (List [c1 ], List [c1_gth ])
2380
+ self .assertNotEqual (List [c1 ], List [C ])
2381
+ self .assertNotEqual (List [c1_gth ], List [C ])
2382
+ self .assertEquals (Union [c1 , c1_gth ], Union [c1 ])
2383
+ self .assertEquals (Union [c1 , c1_gth , int ], Union [c1 , int ])
2384
+
2385
+ def test_forward_equality_hash (self ):
2386
+ c1 = typing .ForwardRef ('int' )
2387
+ c1_gth = typing .ForwardRef ('int' )
2388
+ c2 = typing .ForwardRef ('int' )
2389
+ c2_gth = typing .ForwardRef ('int' )
2390
+
2391
+ def foo (a : c1_gth , b : c2_gth ):
2392
+ pass
2393
+ get_type_hints (foo , globals (), locals ())
2394
+
2395
+ self .assertEqual (hash (c1 ), hash (c2 ))
2396
+ self .assertEqual (hash (c1_gth ), hash (c2_gth ))
2397
+ self .assertEqual (hash (c1 ), hash (c1_gth ))
2398
+
2399
+ def test_forward_equality_namespace (self ):
2400
+ class A :
2401
+ pass
2402
+ def namespace1 ():
2403
+ a = typing .ForwardRef ('A' )
2404
+ def fun (x : a ):
2405
+ pass
2406
+ get_type_hints (fun , globals (), locals ())
2407
+ return a
2408
+
2409
+ def namespace2 ():
2410
+ a = typing .ForwardRef ('A' )
2411
+
2412
+ class A :
2413
+ pass
2414
+ def fun (x : a ):
2415
+ pass
2416
+
2417
+ get_type_hints (fun , globals (), locals ())
2418
+ return a
2419
+
2420
+ self .assertEqual (namespace1 (), namespace1 ())
2421
+ self .assertNotEqual (namespace1 (), namespace2 ())
2422
+
2364
2423
def test_forward_repr (self ):
2365
2424
self .assertEqual (repr (List ['int' ]), "typing.List[ForwardRef('int')]" )
2366
2425
@@ -2380,6 +2439,63 @@ def foo(a: Tuple['T']):
2380
2439
self .assertEqual (get_type_hints (foo , globals (), locals ()),
2381
2440
{'a' : Tuple [T ]})
2382
2441
2442
+ def test_forward_recursion_actually (self ):
2443
+ def namespace1 ():
2444
+ a = typing .ForwardRef ('A' )
2445
+ A = a
2446
+ def fun (x : a ): pass
2447
+
2448
+ ret = get_type_hints (fun , globals (), locals ())
2449
+ return a
2450
+
2451
+ def namespace2 ():
2452
+ a = typing .ForwardRef ('A' )
2453
+ A = a
2454
+ def fun (x : a ): pass
2455
+
2456
+ ret = get_type_hints (fun , globals (), locals ())
2457
+ return a
2458
+
2459
+ def cmp (o1 , o2 ):
2460
+ return o1 == o2
2461
+
2462
+ r1 = namespace1 ()
2463
+ r2 = namespace2 ()
2464
+ self .assertIsNot (r1 , r2 )
2465
+ self .assertRaises (RecursionError , cmp , r1 , r2 )
2466
+
2467
+ def test_union_forward_recursion (self ):
2468
+ ValueList = List ['Value' ]
2469
+ Value = Union [str , ValueList ]
2470
+
2471
+ class C :
2472
+ foo : List [Value ]
2473
+ class D :
2474
+ foo : Union [Value , ValueList ]
2475
+ class E :
2476
+ foo : Union [List [Value ], ValueList ]
2477
+ class F :
2478
+ foo : Union [Value , List [Value ], ValueList ]
2479
+
2480
+ self .assertEqual (get_type_hints (C , globals (), locals ()), get_type_hints (C , globals (), locals ()))
2481
+ self .assertEqual (get_type_hints (C , globals (), locals ()),
2482
+ {'foo' : List [Union [str , List [Union [str , List ['Value' ]]]]]})
2483
+ self .assertEqual (get_type_hints (D , globals (), locals ()),
2484
+ {'foo' : Union [str , List [Union [str , List ['Value' ]]]]})
2485
+ self .assertEqual (get_type_hints (E , globals (), locals ()),
2486
+ {'foo' : Union [
2487
+ List [Union [str , List [Union [str , List ['Value' ]]]]],
2488
+ List [Union [str , List ['Value' ]]]
2489
+ ]
2490
+ })
2491
+ self .assertEqual (get_type_hints (F , globals (), locals ()),
2492
+ {'foo' : Union [
2493
+ str ,
2494
+ List [Union [str , List ['Value' ]]],
2495
+ List [Union [str , List [Union [str , List ['Value' ]]]]]
2496
+ ]
2497
+ })
2498
+
2383
2499
def test_callable_forward (self ):
2384
2500
2385
2501
def foo (a : Callable [['T' ], 'T' ]):
0 commit comments