mirror of
https://github.com/python/cpython
synced 2026-09-27 09:38:16 +03:00
gh-104683: Argument clinic: cleanup state_modulename_name() (#107340)
This commit is contained in:
parent
2f9bb77764
commit
c2b1689abc
2 changed files with 35 additions and 10 deletions
|
|
@ -679,6 +679,32 @@ class ClinicParserTest(_ParserBase):
|
|||
""")
|
||||
self.assertIsInstance(function.return_converter, clinic.int_return_converter)
|
||||
|
||||
def test_return_converter_invalid_syntax(self):
|
||||
stdout = self.parse_function_should_fail("""
|
||||
module os
|
||||
os.stat -> invalid syntax
|
||||
""")
|
||||
expected_error = "Badly formed annotation for os.stat: 'invalid syntax'"
|
||||
self.assertIn(expected_error, stdout)
|
||||
|
||||
def test_legacy_converter_disallowed_in_return_annotation(self):
|
||||
stdout = self.parse_function_should_fail("""
|
||||
module os
|
||||
os.stat -> "s"
|
||||
""")
|
||||
expected_error = "Legacy converter 's' not allowed as a return converter"
|
||||
self.assertIn(expected_error, stdout)
|
||||
|
||||
def test_unknown_return_converter(self):
|
||||
stdout = self.parse_function_should_fail("""
|
||||
module os
|
||||
os.stat -> foooooooooooooooooooooooo
|
||||
""")
|
||||
expected_error = (
|
||||
"No available return converter called 'foooooooooooooooooooooooo'"
|
||||
)
|
||||
self.assertIn(expected_error, stdout)
|
||||
|
||||
def test_star(self):
|
||||
function = self.parse_function("""
|
||||
module os
|
||||
|
|
|
|||
|
|
@ -4730,6 +4730,7 @@ class DSLParser:
|
|||
return
|
||||
|
||||
line, _, returns = line.partition('->')
|
||||
returns = returns.strip()
|
||||
|
||||
full_name, _, c_basename = line.partition(' as ')
|
||||
full_name = full_name.strip()
|
||||
|
|
@ -4743,23 +4744,21 @@ class DSLParser:
|
|||
return_converter = None
|
||||
if returns:
|
||||
ast_input = f"def x() -> {returns}: pass"
|
||||
module = None
|
||||
try:
|
||||
module = ast.parse(ast_input)
|
||||
module_node = ast.parse(ast_input)
|
||||
except SyntaxError:
|
||||
pass
|
||||
if not module:
|
||||
fail("Badly-formed annotation for " + full_name + ": " + returns)
|
||||
fail(f"Badly formed annotation for {full_name}: {returns!r}")
|
||||
function_node = module_node.body[0]
|
||||
assert isinstance(function_node, ast.FunctionDef)
|
||||
try:
|
||||
name, legacy, kwargs = self.parse_converter(module.body[0].returns)
|
||||
name, legacy, kwargs = self.parse_converter(function_node.returns)
|
||||
if legacy:
|
||||
fail("Legacy converter {!r} not allowed as a return converter"
|
||||
.format(name))
|
||||
fail(f"Legacy converter {name!r} not allowed as a return converter")
|
||||
if name not in return_converters:
|
||||
fail("No available return converter called " + repr(name))
|
||||
fail(f"No available return converter called {name!r}")
|
||||
return_converter = return_converters[name](**kwargs)
|
||||
except ValueError:
|
||||
fail("Badly-formed annotation for " + full_name + ": " + returns)
|
||||
fail(f"Badly formed annotation for {full_name}: {returns!r}")
|
||||
|
||||
fields = [x.strip() for x in full_name.split('.')]
|
||||
function_name = fields.pop()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue