@@ -525,6 +525,53 @@ def test_code_equal_with_instrumentation(self):
525
525
self .assertNotEqual (code1 , code2 )
526
526
sys .settrace (None )
527
527
528
+ @cpython_only
529
+ def test_names_strict_string (self ):
530
+ class StrSubclass (str ): pass
531
+
532
+ def f ():
533
+ return name1 + name2
534
+
535
+ code1 = f .__code__
536
+ code2 = code1 .replace (co_names = tuple (
537
+ StrSubclass (name ) for name in code1 .co_names
538
+ ))
539
+ self .assertEqual (code1 .co_names , ('name1' ,'name2' ))
540
+ self .assertEqual (code2 .co_names , ('name1' ,'name2' ))
541
+ for name in code2 .co_names :
542
+ with self .subTest (name = name ):
543
+ self .assertIs (type (name ), str )
544
+
545
+ @cpython_only
546
+ def test_varnames_strict_string (self ):
547
+ class StrSubclass (str ): pass
548
+
549
+ def f ():
550
+ name1 = name2 = call ()
551
+ return name1 + name2
552
+
553
+ code1 = f .__code__
554
+ code2 = code1 .replace (co_varnames = tuple (
555
+ StrSubclass (name ) for name in code1 .co_varnames
556
+ ))
557
+ self .assertEqual (code1 .co_varnames , ('name1' ,'name2' ))
558
+ self .assertEqual (code2 .co_varnames , ('name1' ,'name2' ))
559
+ for name in code2 .co_varnames :
560
+ with self .subTest (name = name ):
561
+ self .assertIs (type (name ), str )
562
+
563
+ @cpython_only
564
+ def test_names_nonstring (self ):
565
+ def f ():
566
+ var1 , var2 = name1 , name2
567
+ return var1 + var2
568
+
569
+ code = f .__code__
570
+
571
+ with self .assertRaises (TypeError ):
572
+ code .replace (co_names = (1 , 2 ))
573
+ with self .assertRaises (TypeError ):
574
+ code .replace (co_varnames = (1 , 2 ))
528
575
529
576
def isinterned (s ):
530
577
return s is sys .intern (('_' + s + '_' )[1 :- 1 ])
0 commit comments