@@ -2215,9 +2215,11 @@ def wrap_value(s):
22152215 except NameError :
22162216 raise ValueError
22172217
2218- if isinstance (value , (str , int , float , bytes , bool , type (None ),
2219- sentinel )):
2220- return ast .parse (s , mode = 'eval' ).body
2218+ if isinstance (value , (str , int , float , bytes , bool , type (None ))):
2219+ return ast .Constant (value )
2220+ elif isinstance (value , sentinel ):
2221+ return ast .Call (func = ast .Name (id = 'sentinel' ),
2222+ args = [ast .Constant (value .__name__ )])
22212223 raise ValueError
22222224
22232225 class RewriteSymbolics (ast .NodeTransformer ):
@@ -2238,23 +2240,28 @@ def visit_Name(self, node):
22382240 raise ValueError ()
22392241 return wrap_value (node .id )
22402242
2243+ def visit_BinOp (self , node ):
2244+ # Support constant folding of a couple simple binary operations
2245+ # commonly used to define default values in text signatures
2246+ left = self .visit (node .left )
2247+ right = self .visit (node .right )
2248+ if not isinstance (left , ast .Constant ) or not isinstance (right , ast .Constant ):
2249+ raise ValueError
2250+ if isinstance (node .op , ast .Add ):
2251+ return ast .Constant (left .value + right .value )
2252+ elif isinstance (node .op , ast .Sub ):
2253+ return ast .Constant (left .value - right .value )
2254+ elif isinstance (node .op , ast .BitOr ):
2255+ return ast .Constant (left .value | right .value )
2256+ raise ValueError
2257+
22412258 def p (name_node , default_node , default = empty ):
22422259 name = parse_name (name_node )
22432260 if default_node and default_node is not _empty :
22442261 try :
22452262 default_node = RewriteSymbolics ().visit (default_node )
2246- default_source = ast .unparse (default_node )
2247- try :
2248- default = ast .literal_eval (default_source )
2249- except ValueError :
2250- try :
2251- default = eval (default_source , module_dict )
2252- except NameError :
2253- try :
2254- default = eval (default_source , sys_module_dict )
2255- except NameError :
2256- raise ValueError
2257- except ValueError as exc :
2263+ default = ast .literal_eval (default_node )
2264+ except ValueError :
22582265 raise ValueError ("{!r} builtin has invalid signature" .format (obj )) from None
22592266 parameters .append (Parameter (name , kind , default = default , annotation = empty ))
22602267
0 commit comments