Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 6326278

Browse files
tirkarthiserhiy-storchaka
authored andcommitted
bpo-34193: Fix pluralization in getargs.c and test cases. (GH-8438)
1 parent 3e8f962 commit 6326278

5 files changed

Lines changed: 38 additions & 23 deletions

File tree

Lib/test/test_call.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,19 +160,22 @@ def test_varargs3(self):
160160
msg = r"^from_bytes\(\) takes at most 2 positional arguments \(3 given\)"
161161
self.assertRaisesRegex(TypeError, msg, int.from_bytes, b'a', 'little', False)
162162

163-
def test_varargs4(self):
163+
def test_varargs1min(self):
164164
msg = r"get expected at least 1 argument, got 0"
165165
self.assertRaisesRegex(TypeError, msg, {}.get)
166166

167-
def test_varargs5(self):
167+
msg = r"expected 1 argument, got 0"
168+
self.assertRaisesRegex(TypeError, msg, {}.__delattr__)
169+
170+
def test_varargs2min(self):
168171
msg = r"getattr expected at least 2 arguments, got 0"
169172
self.assertRaisesRegex(TypeError, msg, getattr)
170173

171-
def test_varargs6(self):
174+
def test_varargs1max(self):
172175
msg = r"input expected at most 1 argument, got 2"
173176
self.assertRaisesRegex(TypeError, msg, input, 1, 2)
174177

175-
def test_varargs7(self):
178+
def test_varargs2max(self):
176179
msg = r"get expected at most 2 arguments, got 3"
177180
self.assertRaisesRegex(TypeError, msg, {}.get, 1, 2, 3)
178181

Lib/test/test_getargs2.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -682,11 +682,11 @@ def test_required_args(self):
682682
self.assertEqual(self.getargs(1), (1, -1, -1))
683683
# required positional arg missing
684684
with self.assertRaisesRegex(TypeError,
685-
r"function takes at least 1 positional arguments \(0 given\)"):
685+
r"function takes at least 1 positional argument \(0 given\)"):
686686
self.getargs()
687687

688688
with self.assertRaisesRegex(TypeError,
689-
r"function takes at least 1 positional arguments \(0 given\)"):
689+
r"function takes at least 1 positional argument \(0 given\)"):
690690
self.getargs(keyword=3)
691691

692692
def test_empty_keyword(self):
@@ -1112,15 +1112,15 @@ def test_positional_only(self):
11121112
parse((1,), {'a': 3}, 'OOO', ['', '', 'a'])
11131113
parse((1,), {}, 'O|OO', ['', '', 'a'])
11141114
with self.assertRaisesRegex(TypeError,
1115-
r'function takes at least 1 positional arguments \(0 given\)'):
1115+
r'function takes at least 1 positional argument \(0 given\)'):
11161116
parse((), {}, 'O|OO', ['', '', 'a'])
11171117
parse((1, 2), {'a': 3}, 'OO$O', ['', '', 'a'])
11181118
with self.assertRaisesRegex(TypeError,
11191119
r'function takes exactly 2 positional arguments \(1 given\)'):
11201120
parse((1,), {'a': 3}, 'OO$O', ['', '', 'a'])
11211121
parse((1,), {}, 'O|O$O', ['', '', 'a'])
11221122
with self.assertRaisesRegex(TypeError,
1123-
r'function takes at least 1 positional arguments \(0 given\)'):
1123+
r'function takes at least 1 positional argument \(0 given\)'):
11241124
parse((), {}, 'O|O$O', ['', '', 'a'])
11251125
with self.assertRaisesRegex(SystemError, r'Empty parameter name after \$'):
11261126
parse((1,), {}, 'O|$OO', ['', '', 'a'])
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix pluralization in TypeError messages in getargs.c and typeobject.c:
2+
'1 argument' instead of '1 arguments' and '1 element' instead of '1 elements'.

Objects/typeobject.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5434,7 +5434,7 @@ check_num_args(PyObject *ob, int n)
54345434
return 1;
54355435
PyErr_Format(
54365436
PyExc_TypeError,
5437-
"expected %d arguments, got %zd", n, PyTuple_GET_SIZE(ob));
5437+
"expected %d argument%s, got %zd", n, n == 1 ? "" : "s", PyTuple_GET_SIZE(ob));
54385438
return 0;
54395439
}
54405440

Python/getargs.c

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -540,8 +540,10 @@ converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
540540
levels[0] = 0;
541541
if (toplevel) {
542542
PyOS_snprintf(msgbuf, bufsize,
543-
"expected %d arguments, not %" PY_FORMAT_SIZE_T "d",
544-
n, len);
543+
"expected %d argument%s, not %" PY_FORMAT_SIZE_T "d",
544+
n,
545+
n == 1 ? "" : "s",
546+
len);
545547
}
546548
else {
547549
PyOS_snprintf(msgbuf, bufsize,
@@ -1718,12 +1720,14 @@ vgetargskeywords(PyObject *args, PyObject *kwargs, const char *format,
17181720
}
17191721
else {
17201722
PyErr_Format(PyExc_TypeError,
1721-
"%.200s%s takes %s %d positional arguments"
1723+
"%.200s%s takes %s %d positional argument%s"
17221724
" (%d given)",
17231725
(fname == NULL) ? "function" : fname,
17241726
(fname == NULL) ? "" : "()",
17251727
(min != INT_MAX) ? "at most" : "exactly",
1726-
max, nargs);
1728+
max,
1729+
max == 1 ? "" : "s",
1730+
nargs);
17271731
}
17281732
return cleanreturn(0, &freelist);
17291733
}
@@ -1797,12 +1801,14 @@ vgetargskeywords(PyObject *args, PyObject *kwargs, const char *format,
17971801

17981802
if (skip) {
17991803
PyErr_Format(PyExc_TypeError,
1800-
"%.200s%s takes %s %d positional arguments"
1804+
"%.200s%s takes %s %d positional argument%s"
18011805
" (%d given)",
18021806
(fname == NULL) ? "function" : fname,
18031807
(fname == NULL) ? "" : "()",
18041808
(Py_MIN(pos, min) < i) ? "at least" : "exactly",
1805-
Py_MIN(pos, min), nargs);
1809+
Py_MIN(pos, min),
1810+
Py_MIN(pos, min) == 1 ? "" : "s",
1811+
nargs);
18061812
return cleanreturn(0, &freelist);
18071813
}
18081814

@@ -2104,11 +2110,13 @@ vgetargskeywordsfast_impl(PyObject *const *args, Py_ssize_t nargs,
21042110
}
21052111
else {
21062112
PyErr_Format(PyExc_TypeError,
2107-
"%.200s%s takes %s %d positional arguments (%d given)",
2113+
"%.200s%s takes %s %d positional argument%s (%d given)",
21082114
(parser->fname == NULL) ? "function" : parser->fname,
21092115
(parser->fname == NULL) ? "" : "()",
21102116
(parser->min != INT_MAX) ? "at most" : "exactly",
2111-
parser->max, nargs);
2117+
parser->max,
2118+
parser->max == 1 ? "" : "s",
2119+
nargs);
21122120
}
21132121
return cleanreturn(0, &freelist);
21142122
}
@@ -2152,12 +2160,14 @@ vgetargskeywordsfast_impl(PyObject *const *args, Py_ssize_t nargs,
21522160
if (i < pos) {
21532161
Py_ssize_t min = Py_MIN(pos, parser->min);
21542162
PyErr_Format(PyExc_TypeError,
2155-
"%.200s%s takes %s %d positional arguments"
2163+
"%.200s%s takes %s %d positional argument%s"
21562164
" (%d given)",
21572165
(parser->fname == NULL) ? "function" : parser->fname,
21582166
(parser->fname == NULL) ? "" : "()",
21592167
min < parser->max ? "at least" : "exactly",
2160-
min, nargs);
2168+
min,
2169+
min == 1 ? "" : "s",
2170+
nargs);
21612171
}
21622172
else {
21632173
keyword = PyTuple_GET_ITEM(kwtuple, i - pos);
@@ -2417,9 +2427,9 @@ unpack_stack(PyObject *const *args, Py_ssize_t nargs, const char *name,
24172427
else
24182428
PyErr_Format(
24192429
PyExc_TypeError,
2420-
"unpacked tuple should have %s%zd elements,"
2430+
"unpacked tuple should have %s%zd element%s,"
24212431
" but has %zd",
2422-
(min == max ? "" : "at least "), min, nargs);
2432+
(min == max ? "" : "at least "), min, min == 1 ? "" : "s", nargs);
24232433
return 0;
24242434
}
24252435

@@ -2436,9 +2446,9 @@ unpack_stack(PyObject *const *args, Py_ssize_t nargs, const char *name,
24362446
else
24372447
PyErr_Format(
24382448
PyExc_TypeError,
2439-
"unpacked tuple should have %s%zd elements,"
2449+
"unpacked tuple should have %s%zd element%s,"
24402450
" but has %zd",
2441-
(min == max ? "" : "at most "), max, nargs);
2451+
(min == max ? "" : "at most "), max, max == 1 ? "" : "s", nargs);
24422452
return 0;
24432453
}
24442454

0 commit comments

Comments
 (0)