Skip to content

Commit 7c09f9f

Browse files
committed
simplify Lib/inspect.py
1 parent 18cd785 commit 7c09f9f

1 file changed

Lines changed: 22 additions & 15 deletions

File tree

Lib/inspect.py

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)