@@ -2209,7 +2209,7 @@ def wrap_value(s):
22092209
22102210 if isinstance (value , (str , int , float , bytes , bool , type (None ),
22112211 sentinel )):
2212- return ast .Constant ( value )
2212+ return ast .parse ( s )
22132213 raise ValueError
22142214
22152215 class RewriteSymbolics (ast .NodeTransformer ):
@@ -2230,28 +2230,20 @@ def visit_Name(self, node):
22302230 raise ValueError ()
22312231 return wrap_value (node .id )
22322232
2233- def visit_BinOp (self , node ):
2234- # Support constant folding of a couple simple binary operations
2235- # commonly used to define default values in text signatures
2236- left = self .visit (node .left )
2237- right = self .visit (node .right )
2238- if not isinstance (left , ast .Constant ) or not isinstance (right , ast .Constant ):
2239- raise ValueError
2240- if isinstance (node .op , ast .Add ):
2241- return ast .Constant (left .value + right .value )
2242- elif isinstance (node .op , ast .Sub ):
2243- return ast .Constant (left .value - right .value )
2244- elif isinstance (node .op , ast .BitOr ):
2245- return ast .Constant (left .value | right .value )
2246- raise ValueError
2247-
22482233 def p (name_node , default_node , default = empty ):
22492234 name = parse_name (name_node )
22502235 if default_node and default_node is not _empty :
22512236 try :
22522237 default_node = RewriteSymbolics ().visit (default_node )
2253- default = ast .literal_eval (default_node )
2254- except ValueError :
2238+ default_source = ast .unparse (default_node )
2239+ try :
2240+ default = eval (default_source , module_dict )
2241+ except NameError :
2242+ try :
2243+ default = eval (default_source , sys_module_dict )
2244+ except NameError :
2245+ raise ValueError
2246+ except ValueError as exc :
22552247 raise ValueError ("{!r} builtin has invalid signature" .format (obj )) from None
22562248 parameters .append (Parameter (name , kind , default = default , annotation = empty ))
22572249
0 commit comments