Skip to content

Commit 6d016f1

Browse files
committed
Address Serhiy's follow-up comments
1 parent 1ebd726 commit 6d016f1

2 files changed

Lines changed: 32 additions & 49 deletions

File tree

Lib/test/test_clinic.py

Lines changed: 26 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -358,30 +358,16 @@ def test_vararg_after_star(self):
358358
self.expect_failure(block, err, lineno=6)
359359

360360
def test_double_star_after_var_keyword(self):
361-
err = "Function 'my_test_func' has an invalid parameter declaration (**kwargs?): '**kwds: dict'"
361+
err = "parameters cannot follow var-keyword parameter: 'invalid_arg: object'"
362362
block = """
363363
/*[clinic input]
364364
my_test_func
365365
366-
pos_arg: object
367366
**kwds: dict
368-
**
367+
invalid_arg: object
369368
[clinic start generated code]*/
370369
"""
371-
self.expect_failure(block, err, lineno=5)
372-
373-
def test_var_keyword_after_star(self):
374-
err = "Function 'my_test_func' has an invalid parameter declaration: '**'"
375-
block = """
376-
/*[clinic input]
377-
my_test_func
378-
379-
pos_arg: object
380-
**
381-
**kwds: dict
382-
[clinic start generated code]*/
383-
"""
384-
self.expect_failure(block, err, lineno=5)
370+
self.expect_failure(block, err, lineno=7)
385371

386372
def test_module_already_got_one(self):
387373
err = "Already defined module 'm'!"
@@ -1644,11 +1630,6 @@ def test_disallowed_grouping__must_be_position_only(self):
16441630
[
16451631
a: object
16461632
]
1647-
""", """
1648-
with_kwds
1649-
[
1650-
**kwds: dict
1651-
]
16521633
""")
16531634
err = (
16541635
"You cannot use optional groups ('[' and ']') unless all "
@@ -2036,38 +2017,40 @@ def test_slash_after_var_keyword(self):
20362017
block = """
20372018
module foo
20382019
foo.bar
2039-
x: int
2040-
y: int
20412020
**kwds: dict
2042-
z: int
20432021
/
20442022
"""
2045-
err = "Function 'bar' has an invalid parameter declaration (**kwargs?): '**kwds: dict'"
2023+
err = "parameters cannot follow var-keyword parameter: '/'"
20462024
self.expect_failure(block, err)
20472025

20482026
def test_star_after_var_keyword(self):
20492027
block = """
20502028
module foo
20512029
foo.bar
2052-
x: int
2053-
y: int
20542030
**kwds: dict
2055-
z: int
20562031
*
20572032
"""
2058-
err = "Function 'bar' has an invalid parameter declaration (**kwargs?): '**kwds: dict'"
2033+
err = "parameters cannot follow var-keyword parameter: '*'"
20592034
self.expect_failure(block, err)
20602035

20612036
def test_parameter_after_var_keyword(self):
20622037
block = """
20632038
module foo
20642039
foo.bar
2065-
x: int
2066-
y: int
20672040
**kwds: dict
20682041
z: int
20692042
"""
2070-
err = "Function 'bar' has an invalid parameter declaration (**kwargs?): '**kwds: dict'"
2043+
err = "parameters cannot follow var-keyword parameter: 'z: int'"
2044+
self.expect_failure(block, err)
2045+
2046+
def test_group_with_var_keyword(self):
2047+
block = """
2048+
with_kwds
2049+
[
2050+
**kwds: dict
2051+
]
2052+
"""
2053+
err = "parameters cannot follow var-keyword parameter: ']'"
20712054
self.expect_failure(block, err)
20722055

20732056
def test_depr_star_must_come_after_slash(self):
@@ -2159,7 +2142,7 @@ def test_parameters_no_more_than_one_vararg(self):
21592142
self.expect_failure(block, err, lineno=3)
21602143

21612144
def test_parameters_no_more_than_one_var_keyword(self):
2162-
err = "Encountered parameter line when not expecting parameters: **var_keyword_2: dict"
2145+
err = "parameters cannot follow var-keyword parameter: '**var_keyword_2: dict'"
21632146
block = """
21642147
module foo
21652148
foo.bar
@@ -2714,7 +2697,9 @@ def test_var_keyword_with_pos_or_kw(self):
27142697
x: int
27152698
**kwds: dict
27162699
"""
2717-
err = "Function 'bar' has an invalid parameter declaration (**kwargs?): '**kwds: dict'"
2700+
err = ("Function 'bar' uses a var-keyword parameter and other "
2701+
"non-positional parameters, which Argument Clinic does "
2702+
"not currently support: '**kwds: dict'")
27182703
self.expect_failure(block, err)
27192704

27202705
def test_var_keyword_with_kw_only(self):
@@ -2727,7 +2712,9 @@ def test_var_keyword_with_kw_only(self):
27272712
y: int
27282713
**kwds: dict
27292714
"""
2730-
err = "Function 'bar' has an invalid parameter declaration (**kwargs?): '**kwds: dict'"
2715+
err = ("Function 'bar' uses a var-keyword parameter and other "
2716+
"non-positional parameters, which Argument Clinic does "
2717+
"not currently support: '**kwds: dict'")
27312718
self.expect_failure(block, err)
27322719

27332720
def test_var_keyword_with_pos_or_kw_and_kw_only(self):
@@ -2741,7 +2728,9 @@ def test_var_keyword_with_pos_or_kw_and_kw_only(self):
27412728
z: int
27422729
**kwds: dict
27432730
"""
2744-
err = "Function 'bar' has an invalid parameter declaration (**kwargs?): '**kwds: dict'"
2731+
err = ("Function 'bar' uses a var-keyword parameter and other "
2732+
"non-positional parameters, which Argument Clinic does "
2733+
"not currently support: '**kwds: dict'")
27452734
self.expect_failure(block, err)
27462735

27472736
def test_allow_negative_accepted_by_py_ssize_t_converter_only(self):

Tools/clinic/libclinic/dsl_parser.py

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -862,6 +862,9 @@ def state_parameter(self, line: str) -> None:
862862
line = match[1]
863863
version = self.parse_version(match[2])
864864

865+
if not self.expecting_parameters:
866+
fail(f'parameters cannot follow var-keyword parameter: {line!r}')
867+
865868
func = self.function
866869
match line:
867870
case '*':
@@ -878,10 +881,6 @@ def state_parameter(self, line: str) -> None:
878881
def parse_parameter(self, line: str) -> None:
879882
assert self.function is not None
880883

881-
if not self.expecting_parameters:
882-
fail('Encountered parameter line when not expecting '
883-
f'parameters: {line}')
884-
885884
match self.parameter_state:
886885
case ParamState.START | ParamState.REQUIRED:
887886
self.to_required()
@@ -932,8 +931,9 @@ def parse_parameter(self, line: str) -> None:
932931
for p in self.function.parameters.values()
933932
)
934933
if has_non_positional_param:
935-
fail(f"Function {self.function.name!r} has an "
936-
f"invalid parameter declaration (**kwargs?): {line!r}")
934+
fail(f'Function {self.function.name!r} uses a var-keyword parameter '
935+
f'and other non-positional parameters, which Argument Clinic '
936+
f'does not currently support: {line!r}')
937937
is_var_keyword = True
938938
parameter = function_args.kwarg
939939
else:
@@ -1182,9 +1182,6 @@ def parse_star(self, function: Function, version: VersionTuple | None) -> None:
11821182
The 'version' parameter signifies the future version from which
11831183
the marker will take effect (None means it is already in effect).
11841184
"""
1185-
if not self.expecting_parameters:
1186-
fail("Encountered '*' when not expecting parameters")
1187-
11881185
if version is None:
11891186
self.check_previous_star()
11901187
self.check_remaining_star()
@@ -1240,9 +1237,6 @@ def parse_slash(self, function: Function, version: VersionTuple | None) -> None:
12401237
The 'version' parameter signifies the future version from which
12411238
the marker will take effect (None means it is already in effect).
12421239
"""
1243-
if not self.expecting_parameters:
1244-
fail("Encountered '/' when not expecting parameters")
1245-
12461240
if version is None:
12471241
if self.deprecated_keyword:
12481242
fail(f"Function {function.name!r}: '/' must precede '/ [from ...]'")

0 commit comments

Comments
 (0)