@@ -1141,6 +1141,13 @@ def test_copy_with_parents(self):
11411141 self .assertEqual (to_tuple (child .parent ), to_tuple (node ))
11421142
11431143
1144+ def test_replace_non_str_kwarg (self ):
1145+ node = ast .Name (id = "x" )
1146+ errmsg = "got an unexpected keyword argument <object object"
1147+ with self .assertRaisesRegex (TypeError , errmsg ):
1148+ node .__replace__ (** {object (): "y" })
1149+
1150+
11441151class ASTHelpers_Test (unittest .TestCase ):
11451152 maxDiff = None
11461153
@@ -3141,6 +3148,27 @@ class _AllFieldTypes(ast.AST):
31413148 self .assertIs (obj .a , None )
31423149 self .assertEqual (obj .b , [])
31433150
3151+ def test_non_str_kwarg (self ):
3152+ warn_msg = "got an unexpected keyword argument <object object"
3153+ with (
3154+ self .assertRaises (TypeError ),
3155+ self .assertWarnsRegex (DeprecationWarning , warn_msg ),
3156+ ):
3157+ ast .Name (** {object (): 'y' })
3158+
3159+ class FakeStr :
3160+ def __init__ (self , value ):
3161+ self .value = value
3162+
3163+ def __hash__ (self ):
3164+ return hash (self .value )
3165+
3166+ def __eq__ (self , other ):
3167+ return isinstance (other , str ) and self .value == other
3168+
3169+ with self .assertRaisesRegex (TypeError , "got multiple values for argument" ):
3170+ ast .Name ("x" , ** {FakeStr ('id' ): 'y' })
3171+
31443172
31453173@support .cpython_only
31463174class ModuleStateTests (unittest .TestCase ):
0 commit comments