import asyncio
import datetime
import json
import re
import sys
import unicodedata
is_monty = sys.platform == 'monty'
try:
[1, 2].sort(bogus=1)
assert False, 'list.sort with unknown kwarg should raise'
except TypeError as e:
assert str(e) == "sort() got an unexpected keyword argument 'bogus'", f'py-unknown-kw: {e}'
try:
sorted([1], bogus=1)
assert False, 'sorted with unknown kwarg should raise'
except TypeError as e:
assert str(e) == "sort() got an unexpected keyword argument 'bogus'", f'py-unknown-kw-sorted: {e}'
try:
sorted([1], key=None, bogus=1)
assert False, 'sorted valid+unknown kwarg should raise'
except TypeError as e:
assert str(e) == "sort() got an unexpected keyword argument 'bogus'", f'py-mixed-kw-sorted: {e}'
try:
sorted([1], iterable=[2])
assert False, 'sorted with iterable= kwarg should raise'
except TypeError as e:
assert str(e) == "sort() got an unexpected keyword argument 'iterable'", f'py-iterable-kw-routed: {e}'
try:
re.split('a', 'banana', pattern='b')
assert False, 're.split with pos+kw conflict should raise'
except TypeError as e:
assert str(e) == "split() got multiple values for argument 'pattern'", f'py-pos-kw: {e}'
try:
re.sub('a', 'b', 'c', 'd', 'e', 'f', bogus=1)
assert False, 're.sub with excess positionals + unknown kwarg should raise unknown-kwarg'
except TypeError as e:
assert str(e) == "sub() got an unexpected keyword argument 'bogus'", f'py-def-kw-beats-overflow: {e}'
try:
re.sub('a', 'b', 'c', 'd', 'e', 'f', pattern='x')
assert False, 're.sub with excess positionals + duplicate kwarg should raise multiple-values'
except TypeError as e:
assert str(e) == "sub() got multiple values for argument 'pattern'", f'py-def-dup-beats-overflow: {e}'
try:
json.dumps(1, 2, indent=0)
assert False, 'json.dumps with excess positional + kw-only kwarg should raise overflow'
except TypeError as e:
assert str(e) == (
'dumps() takes 1 positional argument but 2 positional arguments (and 1 keyword-only argument) were given'
), f'py-def-overflow-kwonly: {e}'
try:
'abc'.replace('a')
assert False, 'str.replace() missing arg should raise'
except TypeError as e:
assert str(e) == 'replace() takes at least 2 positional arguments (1 given)', f'py-missing-pos: {e}'
try:
{}.update({1: 2}, {3: 4})
assert False, 'dict.update too many should raise'
except TypeError as e:
assert str(e) == 'update expected at most 1 argument, got 2', f'py-toomany-pos: {e}'
try:
[1, 2].sort(key=int, **{'key': str})
assert False, 'duplicate kw via ** should raise'
except TypeError as e:
assert str(e) == "list.sort() got multiple values for keyword argument 'key'", f'py-dup-kw-only: {e}'
try:
{}.update(a=1, **{'a': 2})
assert False, 'dict.update duplicate kw via ** should raise'
except TypeError as e:
assert str(e) == "dict.update() got multiple values for keyword argument 'a'", f'py-dup-kw-dict: {e}'
try:
'hello'.expandtabs(4, tabsize=8)
assert False, 'expandtabs pos+kw should raise via at_most_total pre-count'
except TypeError as e:
assert str(e) == 'expandtabs() takes at most 1 argument (2 given)', f'py-atmost-total-1: {e}'
try:
'hello'.splitlines(True, keepends=False)
assert False, 'splitlines pos+kw should raise via at_most_total pre-count'
except TypeError as e:
assert str(e) == 'splitlines() takes at most 1 argument (2 given)', f'py-atmost-total-2: {e}'
m = re.match(r'(?P<x>.)', 'a')
assert m is not None
try:
m.groupdict('N/A', default='N/A')
assert False, 'groupdict pos+kw should raise via at_most_total pre-count'
except TypeError as e:
assert str(e) == 'groupdict() takes at most 1 argument (2 given)', f'py-atmost-total-3: {e}'
try:
'hello'.expandtabs(tabsize=8, bogus=1)
assert False, 'expandtabs all-keyword overflow should raise'
except TypeError as e:
assert str(e) == 'expandtabs() takes at most 1 keyword argument (2 given)', f'py-atmost-kw-1: {e}'
try:
round(number=1, ndigits=2, bogus=3)
assert False, 'round all-keyword overflow should raise'
except TypeError as e:
assert str(e) == 'round() takes at most 2 keyword arguments (3 given)', f'named-atmost-kw: {e}'
try:
int(x='1', base=10, bogus=2)
assert False, 'int all-keyword overflow should raise'
except TypeError as e:
assert str(e) == 'int() takes at most 2 keyword arguments (3 given)', f'vectorcall-atmost-kw: {e}'
try:
sorted()
assert False, 'sorted() should require iterable'
except TypeError as e:
assert str(e) == 'sorted expected 1 argument, got 0', f'py-arity-zero: {e}'
try:
sorted([1], [2])
assert False, 'sorted with two positionals should raise'
except TypeError as e:
assert str(e) == 'sorted expected 1 argument, got 2', f'py-arity-two: {e}'
try:
sorted([3, 1, 2], int)
assert False, 'sorted with positional key should raise'
except TypeError as e:
assert str(e) == 'sorted expected 1 argument, got 2', f'py-arity-key-pos: {e}'
try:
sorted(iterable=[1, 2, 3])
assert False, 'sorted iterable= only should raise on arity'
except TypeError as e:
assert str(e) == 'sorted expected 1 argument, got 0', f'py-arity-iterable-kw: {e}'
try:
map()
assert False, 'map() should require args'
except TypeError as e:
assert str(e) == 'map() must have at least two arguments.', f'py-missing-2: {e}'
try:
map(int)
assert False, 'map(fn) should require ≥2 args'
except TypeError as e:
assert str(e) == 'map() must have at least two arguments.', f'py-missing-1: {e}'
try:
datetime.date(2024, 1, foo=1)
assert False, 'date unknown kwarg under at_most_total should raise'
except TypeError as e:
assert str(e) == "function missing required argument 'day' (pos 3)", f'c-unknown-kw: {e}'
try:
datetime.date(2024, day=3, month=2, foo=1)
assert False, 'date with extra unknown should raise'
except TypeError as e:
assert str(e) == 'function takes at most 3 arguments (4 given)', f'c-atmost-total-precheck: {e}'
try:
datetime.date(2024, day=3, month=2)
assert datetime.date(2024, day=3, month=2).day == 3
except TypeError as e:
assert False, f'unexpected error: {e}'
try:
datetime.datetime(2024, 1, 1, year=2025)
assert False, 'datetime year pos+kw should raise'
except TypeError as e:
assert str(e) == "argument for function given by name ('year') and position (1)", f'c-pos-kw: {e}'
try:
datetime.date(2024)
assert False, 'date with 1 positional should raise missing'
except TypeError as e:
assert str(e) == "function missing required argument 'month' (pos 2)", f'c-missing: {e}'
try:
datetime.date(2024, 1, 1, 1)
assert False, 'date 4 positional should raise'
except TypeError as e:
assert str(e) == 'function takes at most 3 arguments (4 given)', f'c-atmost-total-pos: {e}'
try:
datetime.date(2024, 1, 1, year=2025)
assert False, 'date 3pos + dup-kwarg should pre-count to too-many'
except TypeError as e:
assert str(e) == 'function takes at most 3 arguments (4 given)', f'c-atmost-total-kwconflict: {e}'
try:
datetime.datetime(1, 2, 3, 4, 5, 6, 7, 8, 9)
assert False, 'datetime 9 positional should raise'
except TypeError as e:
assert str(e) == 'function takes at most 8 positional arguments (9 given)', f'c-atmost-positional: {e}'
try:
datetime.datetime(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
assert False, 'datetime 11 positional should raise'
except TypeError as e:
assert str(e) == 'function takes at most 9 arguments (11 given)', f'c-atmost-positional-many: {e}'
try:
datetime.datetime(1, 2, 3, 4, 5, 6, 7, 8, 9, fold=0)
assert False, 'datetime 9 positional + fold kwarg should raise'
except TypeError as e:
assert str(e) == 'function takes at most 9 arguments (10 given)', f'c-atmost-positional-kw: {e}'
try:
'a'.replace('b', 'c', 1, 2, 3)
assert False, 'str.replace 5 positional should raise'
except TypeError as e:
assert str(e) == 'replace() takes at most 3 arguments (5 given)', f'py-atmost-pos-many: {e}'
try:
str(wrong=42)
assert False, 'str unknown kwarg should raise'
except TypeError as e:
assert str(e) == "str() got an unexpected keyword argument 'wrong'", f'named-unknown-kw-str: {e}'
try:
bytes(wrong=3)
assert False, 'bytes unknown kwarg should raise'
except TypeError as e:
assert str(e) == "bytes() got an unexpected keyword argument 'wrong'", f'named-unknown-kw-bytes: {e}'
try:
datetime.timezone(datetime.timedelta(0), bogus=1)
assert False, 'timezone unknown kwarg should raise'
except TypeError as e:
assert str(e) == "timezone() got an unexpected keyword argument 'bogus'", f'named-unknown-kw-tz: {e}'
try:
str(42, object=42)
assert False, 'str pos+kw should raise'
except TypeError as e:
assert str(e) == "argument for str() given by name ('object') and position (1)", f'named-pos-kw-str: {e}'
try:
bytes(3, source=3)
assert False, 'bytes pos+kw should raise'
except TypeError as e:
assert str(e) == "argument for bytes() given by name ('source') and position (1)", f'named-pos-kw-bytes: {e}'
try:
datetime.timezone(datetime.timedelta(0), offset=datetime.timedelta(0))
assert False, 'timezone pos+kw should raise'
except TypeError as e:
assert str(e) == "argument for timezone() given by name ('offset') and position (1)", f'named-pos-kw-tz: {e}'
try:
datetime.timezone()
assert False, 'timezone() should raise missing offset'
except TypeError as e:
assert str(e) == "timezone() missing required argument 'offset' (pos 1)", f'named-missing: {e}'
try:
datetime.timezone(datetime.timedelta(0), 'A', name='B')
assert False, 'timezone 3 args should raise via at_most_total'
except TypeError as e:
assert str(e) == 'timezone() takes at most 2 arguments (3 given)', f'named-atmost-total: {e}'
try:
'a'.replace(**{1: 'x'})
assert False, 'non-string kwarg key should raise'
except TypeError as e:
assert str(e) == 'keywords must be strings', f'nonstring-key: {e}'
try:
print('a', sep=',', **{'sep': '.'})
assert False, 'print duplicate sep should raise'
except TypeError as e:
assert str(e) == "print() got multiple values for keyword argument 'sep'", f'cross-dup-kw-only: {e}'
if is_monty:
async def foo():
return 1
try:
asyncio.gather(foo(), foo(), xxx=True)
assert False, 'gather with kwarg should raise'
except NotImplementedError as e:
assert str(e) == 'gather() does not yet support keyword arguments'
try:
'a'.encode(42, bogus=1)
assert False, 'encode bad type + unknown kwarg should raise on the kwarg'
except TypeError as e:
assert str(e) == "encode() got an unexpected keyword argument 'bogus'", f'clinic-unknown-vs-type: {e}'
try:
'a'.encode(42, encoding='x')
assert False, 'encode bad type + conflict should raise the conflict'
except TypeError as e:
assert str(e) == "argument for encode() given by name ('encoding') and position (1)", f'clinic-conflict: {e}'
try:
'a'.encode(42, 'x', 'y')
assert False, 'encode 3 positional should raise arity'
except TypeError as e:
assert str(e) == 'encode() takes at most 2 arguments (3 given)', f'clinic-atmost-pos: {e}'
try:
'a'.encode('utf-8', 'strict', bogus=1)
assert False, 'encode 2 pos + kwarg should pre-count to too-many'
except TypeError as e:
assert str(e) == 'encode() takes at most 2 arguments (3 given)', f'clinic-atmost-total: {e}'
try:
b'a'.decode('utf-8', 'strict', bogus=1)
assert False, 'decode 2 pos + kwarg should pre-count to too-many'
except TypeError as e:
assert str(e) == 'decode() takes at most 2 arguments (3 given)', f'clinic-atmost-total-decode: {e}'
try:
datetime.date('x', year=1)
assert False, 'date bad type + conflict should raise the conversion error'
except TypeError as e:
assert str(e) == "'str' object cannot be interpreted as an integer", f'c-convert-vs-conflict: {e}'
try:
datetime.datetime('x', 1, 1, 4, hour=5)
assert False, 'datetime bad year + hour conflict should raise the conversion error'
except TypeError as e:
assert str(e) == "'str' object cannot be interpreted as an integer", f'c-convert-vs-later-conflict: {e}'
try:
datetime.date(2024, month='x')
assert False, 'date bad-type month kwarg should raise at param 2'
except TypeError as e:
assert str(e) == "'str' object cannot be interpreted as an integer", f'c-kwarg-convert: {e}'
try:
datetime.date(month='x')
assert False, 'date missing year should beat month conversion'
except TypeError as e:
assert str(e) == "function missing required argument 'year' (pos 1)", f'c-missing-vs-kwarg-convert: {e}'
try:
datetime.datetime(2024, 1, 1, bogus=6, year=5)
assert False, 'datetime conflict + unknown should raise the conflict'
except TypeError as e:
assert str(e) == "argument for function given by name ('year') and position (1)", f'c-conflict-vs-unknown: {e}'
try:
datetime.datetime(2024, 1, 1, day=1, month=2)
assert False, 'datetime double conflict should report month'
except TypeError as e:
assert str(e) == "argument for function given by name ('month') and position (2)", f'c-earliest-conflict: {e}'
try:
next(iter([]), 1, 2, bogus=1)
assert False, 'next with kwargs should raise no-keyword error'
except TypeError as e:
assert str(e) == 'next() takes no keyword arguments'
try:
reversed(sequence=[1])
assert False, 'reversed with kwargs should raise no-keyword error'
except TypeError as e:
assert str(e) == 'reversed() takes no keyword arguments'
try:
unicodedata.name('a', bogus=1)
assert False, 'unicodedata.name with kwargs should raise no-keyword error'
except TypeError as e:
assert str(e) == 'unicodedata.name() takes no keyword arguments'
try:
reversed([1], [2])
assert False, 'reversed with 2 args should raise'
except TypeError as e:
assert str(e) == 'reversed expected 1 argument, got 2'
try:
sum(iterable=[1])
assert False, 'sum(iterable=...) should raise'
except TypeError as e:
assert str(e) == 'sum() takes at least 1 positional argument (0 given)'
try:
sum([1], 1, 1)
assert False, 'sum with 3 args should raise'
except TypeError as e:
assert str(e) == 'sum() takes at most 2 arguments (3 given)'
try:
sum([1], bogus=1)
assert False, 'sum with unknown kwarg should raise'
except TypeError as e:
assert str(e) == "sum() got an unexpected keyword argument 'bogus'"
try:
round()
assert False, 'round() should raise'
except TypeError as e:
assert str(e) == "round() missing required argument 'number' (pos 1)"
try:
round(ndigits=1)
assert False, 'round(ndigits=1) should raise'
except TypeError as e:
assert str(e) == "round() missing required argument 'number' (pos 1)"
try:
round(1, 2, 3)
assert False, 'round with 3 args should raise'
except TypeError as e:
assert str(e) == 'round() takes at most 2 arguments (3 given)'
try:
round(1, bogus=2)
assert False, 'round with unknown kwarg should raise'
except TypeError as e:
assert str(e) == "round() got an unexpected keyword argument 'bogus'"
try:
enumerate()
assert False, 'enumerate() should raise'
except TypeError as e:
assert str(e) == "enumerate() missing required argument 'iterable'"
try:
enumerate(start=1, bogus=1, iterable=[1])
assert False, 'enumerate 3-kwarg form should raise'
except TypeError as e:
assert str(e) == "enumerate() missing required argument 'iterable'"
try:
enumerate(start=1)
assert False, 'enumerate(start=1) should raise'
except TypeError as e:
assert str(e) == "'start' is an invalid keyword argument for enumerate()"
try:
enumerate([1], iterable=[2])
assert False, 'enumerate positional + iterable= should raise'
except TypeError as e:
assert str(e) == "'iterable' is an invalid keyword argument for enumerate()"
try:
enumerate([1], bogus=1)
assert False, 'enumerate with unknown kwarg should raise'
except TypeError as e:
assert str(e) == "'bogus' is an invalid keyword argument for enumerate()"
try:
enumerate([1], 0, 0)
assert False, 'enumerate with 3 positionals should raise'
except TypeError as e:
assert str(e) == 'enumerate() takes at most 2 arguments (3 given)'
try:
enumerate([1], bogus=1, worse=2)
assert False, 'enumerate 1-pos 2-kwarg should raise'
except TypeError as e:
assert str(e) == 'enumerate() takes at most 2 arguments (3 given)'
try:
next()
assert False, 'next() should raise'
except TypeError as e:
assert str(e) == 'next expected at least 1 argument, got 0'
try:
next(iter([]), 1, 2)
assert False, 'next with 3 args should raise'
except TypeError as e:
assert str(e) == 'next expected at most 2 arguments, got 3'
try:
reversed()
assert False, 'reversed() should raise'
except TypeError as e:
assert str(e) == 'reversed expected 1 argument, got 0'
try:
sum([1], start='x')
assert False, 'sum string start= should raise'
except TypeError as e:
assert str(e) == "sum() can't sum strings [use ''.join(seq) instead]"
try:
enumerate(bogus=1)
assert False, 'enumerate(bogus=1) should raise'
except TypeError as e:
assert str(e) == "'bogus' is an invalid keyword argument for enumerate()"
try:
enumerate(start=1, bogus=2)
assert False, 'enumerate(start=, bogus=) should raise'
except TypeError as e:
assert str(e) == "'bogus' is an invalid keyword argument for enumerate()"
try:
enumerate(bogus=2, start=1)
assert False, 'enumerate(bogus=, start=) should raise'
except TypeError as e:
assert str(e) == "'bogus' is an invalid keyword argument for enumerate()"
try:
enumerate(iterable=[1], bogus=1)
assert False, 'enumerate(iterable=, bogus=) should raise'
except TypeError as e:
assert str(e) == "'bogus' is an invalid keyword argument for enumerate()"
try:
enumerate([1], **{1: 2})
assert False, 'enumerate non-string key should raise'
except TypeError as e:
assert str(e) == 'keywords must be strings'
try:
enumerate(**{1: 2})
assert False, 'enumerate lone non-string key should raise'
except TypeError as e:
assert str(e) == 'keywords must be strings'