blob: 596a3ef87f49f43392bb71679f929e5ea8b0f621 [file] [log] [blame]
Barry Warsaw408b6d32002-07-30 23:27:12 +00001from test.test_support import verify, verbose, TestFailed, sortdict
Raymond Hettinger53dbe392008-02-12 20:03:09 +00002from collections import UserDict, UserList
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +00003
Raymond Hettinger40174c32003-05-31 07:04:16 +00004def e(a, b):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00005 print(a, b)
Raymond Hettinger40174c32003-05-31 07:04:16 +00006
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +00007def f(*a, **k):
Guido van Rossumbe19ed72007-02-09 05:37:30 +00008 print(a, sortdict(k))
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +00009
10def g(x, *y, **z):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000011 print(x, y, sortdict(z))
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000012
13def h(j=1, a=2, h=3):
Guido van Rossumbe19ed72007-02-09 05:37:30 +000014 print(j, a, h)
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000015
16f()
17f(1)
18f(1, 2)
19f(1, 2, 3)
20
21f(1, 2, 3, *(4, 5))
22f(1, 2, 3, *[4, 5])
Jeremy Hylton003663d2000-03-28 23:53:22 +000023f(1, 2, 3, *UserList([4, 5]))
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000024f(1, 2, 3, **{'a':4, 'b':5})
25f(1, 2, 3, *(4, 5), **{'a':6, 'b':7})
26f(1, 2, 3, x=4, y=5, *(6, 7), **{'a':8, 'b':9})
27
Guido van Rossumd59da4b2007-05-22 18:11:13 +000028
29f(1, 2, 3, **UserDict(a=4, b=5))
30f(1, 2, 3, *(4, 5), **UserDict(a=6, b=7))
31f(1, 2, 3, x=4, y=5, *(6, 7), **UserDict(a=8, b=9))
32
33
Raymond Hettinger40174c32003-05-31 07:04:16 +000034# Verify clearing of SF bug #733667
35try:
36 e(c=3)
37except TypeError:
38 pass
39else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000040 print("should raise TypeError: e() got an unexpected keyword argument 'c'")
Raymond Hettinger40174c32003-05-31 07:04:16 +000041
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000042try:
43 g()
Guido van Rossumb940e112007-01-10 16:19:56 +000044except TypeError as err:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000045 print("TypeError:", err)
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000046else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000047 print("should raise TypeError: not enough arguments; expected 1, got 0")
Fred Drake004d5e62000-10-23 17:22:08 +000048
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000049try:
50 g(*())
Guido van Rossumb940e112007-01-10 16:19:56 +000051except TypeError as err:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000052 print("TypeError:", err)
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000053else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000054 print("should raise TypeError: not enough arguments; expected 1, got 0")
Fred Drake004d5e62000-10-23 17:22:08 +000055
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000056try:
57 g(*(), **{})
Guido van Rossumb940e112007-01-10 16:19:56 +000058except TypeError as err:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000059 print("TypeError:", err)
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000060else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000061 print("should raise TypeError: not enough arguments; expected 1, got 0")
Fred Drake004d5e62000-10-23 17:22:08 +000062
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000063g(1)
64g(1, 2)
65g(1, 2, 3)
66g(1, 2, 3, *(4, 5))
Jeremy Hylton074c3e62000-03-30 23:55:31 +000067class Nothing: pass
68try:
69 g(*Nothing())
Guido van Rossumb940e112007-01-10 16:19:56 +000070except TypeError as attr:
Guido van Rossum4b491012000-04-10 13:37:14 +000071 pass
Jeremy Hylton074c3e62000-03-30 23:55:31 +000072else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000073 print("should raise TypeError")
Jeremy Hylton074c3e62000-03-30 23:55:31 +000074
75class Nothing:
76 def __len__(self):
77 return 5
78try:
79 g(*Nothing())
Guido van Rossumb940e112007-01-10 16:19:56 +000080except TypeError as attr:
Guido van Rossum4b491012000-04-10 13:37:14 +000081 pass
Jeremy Hylton074c3e62000-03-30 23:55:31 +000082else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000083 print("should raise TypeError")
Fred Drake004d5e62000-10-23 17:22:08 +000084
Jeremy Hylton074c3e62000-03-30 23:55:31 +000085class Nothing:
86 def __len__(self):
87 return 5
88 def __getitem__(self, i):
89 if i < 3:
90 return i
91 else:
Collin Winter3add4d72007-08-29 23:37:32 +000092 raise IndexError(i)
Jeremy Hylton074c3e62000-03-30 23:55:31 +000093g(*Nothing())
94
Samuele Pedroni8036c832004-02-21 21:03:30 +000095class Nothing:
96 def __init__(self):
97 self.c = 0
98 def __iter__(self):
99 return self
100try:
101 g(*Nothing())
Guido van Rossumb940e112007-01-10 16:19:56 +0000102except TypeError as attr:
Samuele Pedroni8036c832004-02-21 21:03:30 +0000103 pass
104else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000105 print("should raise TypeError")
Samuele Pedroni8036c832004-02-21 21:03:30 +0000106
107class Nothing:
108 def __init__(self):
109 self.c = 0
110 def __iter__(self):
111 return self
Georg Brandla18af4e2007-04-21 15:47:16 +0000112 def __next__(self):
Samuele Pedroni8036c832004-02-21 21:03:30 +0000113 if self.c == 4:
114 raise StopIteration
115 c = self.c
116 self.c += 1
117 return c
118g(*Nothing())
119
Jeremy Hylton074c3e62000-03-30 23:55:31 +0000120# make sure the function call doesn't stomp on the dictionary?
121d = {'a': 1, 'b': 2, 'c': 3}
122d2 = d.copy()
Marc-André Lemburg36619082001-01-17 19:11:13 +0000123verify(d == d2)
Jeremy Hylton074c3e62000-03-30 23:55:31 +0000124g(1, d=4, **d)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000125print(sortdict(d))
126print(sortdict(d2))
Marc-André Lemburg36619082001-01-17 19:11:13 +0000127verify(d == d2, "function call modified dictionary")
Jeremy Hylton074c3e62000-03-30 23:55:31 +0000128
129# what about willful misconduct?
130def saboteur(**kw):
Vladimir Marangozov5ff2ac22000-07-15 00:42:09 +0000131 kw['x'] = locals() # yields a cyclic kw
132 return kw
Jeremy Hylton074c3e62000-03-30 23:55:31 +0000133d = {}
Vladimir Marangozov5ff2ac22000-07-15 00:42:09 +0000134kw = saboteur(a=1, **d)
Marc-André Lemburg36619082001-01-17 19:11:13 +0000135verify(d == {})
Vladimir Marangozov5ff2ac22000-07-15 00:42:09 +0000136# break the cycle
137del kw['x']
Fred Drake004d5e62000-10-23 17:22:08 +0000138
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +0000139try:
140 g(1, 2, 3, **{'x':4, 'y':5})
Guido van Rossumb940e112007-01-10 16:19:56 +0000141except TypeError as err:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000142 print(err)
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +0000143else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000144 print("should raise TypeError: keyword parameter redefined")
Fred Drake004d5e62000-10-23 17:22:08 +0000145
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +0000146try:
147 g(1, 2, 3, a=4, b=5, *(6, 7), **{'a':8, 'b':9})
Guido van Rossumb940e112007-01-10 16:19:56 +0000148except TypeError as err:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000149 print(err)
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +0000150else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000151 print("should raise TypeError: keyword parameter redefined")
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +0000152
153try:
154 f(**{1:2})
Guido van Rossumb940e112007-01-10 16:19:56 +0000155except TypeError as err:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000156 print(err)
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +0000157else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000158 print("should raise TypeError: keywords must be strings")
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +0000159
160try:
161 h(**{'e': 2})
Guido van Rossumb940e112007-01-10 16:19:56 +0000162except TypeError as err:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000163 print(err)
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +0000164else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000165 print("should raise TypeError: unexpected keyword argument: e")
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +0000166
167try:
168 h(*h)
Guido van Rossumb940e112007-01-10 16:19:56 +0000169except TypeError as err:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000170 print(err)
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +0000171else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000172 print("should raise TypeError: * argument must be a tuple")
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +0000173
174try:
Jeremy Hyltonceccc3c2001-04-11 13:53:35 +0000175 dir(*h)
Guido van Rossumb940e112007-01-10 16:19:56 +0000176except TypeError as err:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000177 print(err)
Jeremy Hyltonceccc3c2001-04-11 13:53:35 +0000178else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000179 print("should raise TypeError: * argument must be a tuple")
Jeremy Hyltonceccc3c2001-04-11 13:53:35 +0000180
181try:
182 None(*h)
Guido van Rossumb940e112007-01-10 16:19:56 +0000183except TypeError as err:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000184 print(err)
Jeremy Hyltonceccc3c2001-04-11 13:53:35 +0000185else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000186 print("should raise TypeError: * argument must be a tuple")
Jeremy Hyltonceccc3c2001-04-11 13:53:35 +0000187
188try:
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +0000189 h(**h)
Guido van Rossumb940e112007-01-10 16:19:56 +0000190except TypeError as err:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000191 print(err)
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +0000192else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000193 print("should raise TypeError: ** argument must be a dictionary")
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +0000194
Jeremy Hyltonceccc3c2001-04-11 13:53:35 +0000195try:
196 dir(**h)
Guido van Rossumb940e112007-01-10 16:19:56 +0000197except TypeError as err:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000198 print(err)
Jeremy Hyltonceccc3c2001-04-11 13:53:35 +0000199else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000200 print("should raise TypeError: ** argument must be a dictionary")
Jeremy Hyltonceccc3c2001-04-11 13:53:35 +0000201
202try:
203 None(**h)
Guido van Rossumb940e112007-01-10 16:19:56 +0000204except TypeError as err:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000205 print(err)
Jeremy Hyltonceccc3c2001-04-11 13:53:35 +0000206else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000207 print("should raise TypeError: ** argument must be a dictionary")
Jeremy Hyltonceccc3c2001-04-11 13:53:35 +0000208
209try:
210 dir(b=1,**{'b':1})
Guido van Rossumb940e112007-01-10 16:19:56 +0000211except TypeError as err:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000212 print(err)
Jeremy Hyltonceccc3c2001-04-11 13:53:35 +0000213else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000214 print("should raise TypeError: dir() got multiple values for keyword argument 'b'")
Jeremy Hyltonceccc3c2001-04-11 13:53:35 +0000215
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +0000216def f2(*a, **b):
217 return a, b
218
219d = {}
220for i in range(512):
221 key = 'k%d' % i
222 d[key] = i
223a, b = f2(1, *(2, 3), **d)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000224print(len(a), len(b), b == d)
Jeremy Hylton6b4ec512000-10-30 17:15:20 +0000225
226class Foo:
227 def method(self, arg1, arg2):
228 return arg1 + arg2
229
230x = Foo()
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000231print(Foo.method(*(x, 1, 2)))
232print(Foo.method(x, *(1, 2)))
Christian Heimes4a22b5d2007-11-25 09:39:14 +0000233print(Foo.method(*(1, 2, 3)))
234print(Foo.method(1, *(2, 3)))
Jeremy Hylton6b4ec512000-10-30 17:15:20 +0000235
Fred Drake1a7aab72001-01-04 22:33:02 +0000236# A PyCFunction that takes only positional parameters should allow an
237# empty keyword dictionary to pass without a complaint, but raise a
238# TypeError if the dictionary is non-empty.
239id(1, **{})
240try:
241 id(1, **{"foo": 1})
242except TypeError:
243 pass
244else:
Collin Winter3add4d72007-08-29 23:37:32 +0000245 raise TestFailed('expected TypeError; no exception raised')
Ka-Ping Yee20579702001-01-15 22:14:16 +0000246
247a, b, d, e, v, k = 'A', 'B', 'D', 'E', 'V', 'K'
248funcs = []
249maxargs = {}
250for args in ['', 'a', 'ab']:
251 for defargs in ['', 'd', 'de']:
252 for vararg in ['', 'v']:
253 for kwarg in ['', 'k']:
254 name = 'z' + args + defargs + vararg + kwarg
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000255 arglist = list(args) + ['%s="%s"' % (x, x) for x in defargs]
Ka-Ping Yee20579702001-01-15 22:14:16 +0000256 if vararg: arglist.append('*' + vararg)
257 if kwarg: arglist.append('**' + kwarg)
Georg Brandl88fc6642007-02-09 21:28:07 +0000258 decl = (('def %s(%s): print("ok %s", a, b, d, e, v, ' +
259 'type(k) is type ("") and k or sortdict(k))')
Tim Peters2f228e72001-05-13 00:19:31 +0000260 % (name, ', '.join(arglist), name))
Ka-Ping Yee20579702001-01-15 22:14:16 +0000261 exec(decl)
262 func = eval(name)
263 funcs.append(func)
264 maxargs[func] = len(args + defargs)
265
266for name in ['za', 'zade', 'zabk', 'zabdv', 'zabdevk']:
267 func = eval(name)
268 for args in [(), (1, 2), (1, 2, 3, 4, 5)]:
269 for kwargs in ['', 'a', 'd', 'ad', 'abde']:
270 kwdict = {}
271 for k in kwargs: kwdict[k] = k + k
Neal Norwitz221085d2007-02-25 20:55:47 +0000272 print(func.__name__, args, sortdict(kwdict), '->', end=' ')
Guido van Rossum68468eb2003-02-27 20:14:51 +0000273 try: func(*args, **kwdict)
Guido van Rossumbe19ed72007-02-09 05:37:30 +0000274 except TypeError as err: print(err)