blob: 274e943ec6347122295254ec87f5915dad0c9926 [file] [log] [blame]
Fredrik Lundhf7850422001-01-17 21:51:36 +00001from test_support import verify, verbose, TestFailed
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +00002from UserList import UserList
3
Tim Peters08dabf02001-01-21 18:52:02 +00004def sortdict(d):
5 keys = d.keys()
6 keys.sort()
7 lst = []
8 for k in keys:
9 lst.append("%r: %r" % (k, d[k]))
10 return "{%s}" % ", ".join(lst)
11
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000012def f(*a, **k):
Tim Peters08dabf02001-01-21 18:52:02 +000013 print a, sortdict(k)
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000014
15def g(x, *y, **z):
Tim Peters08dabf02001-01-21 18:52:02 +000016 print x, y, sortdict(z)
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000017
18def h(j=1, a=2, h=3):
19 print j, a, h
20
21f()
22f(1)
23f(1, 2)
24f(1, 2, 3)
25
26f(1, 2, 3, *(4, 5))
27f(1, 2, 3, *[4, 5])
Jeremy Hylton003663d2000-03-28 23:53:22 +000028f(1, 2, 3, *UserList([4, 5]))
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000029f(1, 2, 3, **{'a':4, 'b':5})
30f(1, 2, 3, *(4, 5), **{'a':6, 'b':7})
31f(1, 2, 3, x=4, y=5, *(6, 7), **{'a':8, 'b':9})
32
33try:
34 g()
35except TypeError, err:
36 print "TypeError:", err
37else:
38 print "should raise TypeError: not enough arguments; expected 1, got 0"
Fred Drake004d5e62000-10-23 17:22:08 +000039
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000040try:
41 g(*())
42except TypeError, err:
43 print "TypeError:", err
44else:
45 print "should raise TypeError: not enough arguments; expected 1, got 0"
Fred Drake004d5e62000-10-23 17:22:08 +000046
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000047try:
48 g(*(), **{})
49except TypeError, err:
50 print "TypeError:", err
51else:
52 print "should raise TypeError: not enough arguments; expected 1, got 0"
Fred Drake004d5e62000-10-23 17:22:08 +000053
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000054g(1)
55g(1, 2)
56g(1, 2, 3)
57g(1, 2, 3, *(4, 5))
Jeremy Hylton074c3e62000-03-30 23:55:31 +000058class Nothing: pass
59try:
60 g(*Nothing())
Tim Peters6912d4d2001-05-05 03:56:37 +000061except TypeError, attr:
Guido van Rossum4b491012000-04-10 13:37:14 +000062 pass
Jeremy Hylton074c3e62000-03-30 23:55:31 +000063else:
Tim Peters6912d4d2001-05-05 03:56:37 +000064 print "should raise TypeError"
Jeremy Hylton074c3e62000-03-30 23:55:31 +000065
66class Nothing:
67 def __len__(self):
68 return 5
69try:
70 g(*Nothing())
Tim Peters6912d4d2001-05-05 03:56:37 +000071except TypeError, attr:
Guido van Rossum4b491012000-04-10 13:37:14 +000072 pass
Jeremy Hylton074c3e62000-03-30 23:55:31 +000073else:
Tim Peters6912d4d2001-05-05 03:56:37 +000074 print "should raise TypeError"
Fred Drake004d5e62000-10-23 17:22:08 +000075
Jeremy Hylton074c3e62000-03-30 23:55:31 +000076class Nothing:
77 def __len__(self):
78 return 5
79 def __getitem__(self, i):
80 if i < 3:
81 return i
82 else:
83 raise IndexError, i
84g(*Nothing())
85
86# make sure the function call doesn't stomp on the dictionary?
87d = {'a': 1, 'b': 2, 'c': 3}
88d2 = d.copy()
Marc-André Lemburg36619082001-01-17 19:11:13 +000089verify(d == d2)
Jeremy Hylton074c3e62000-03-30 23:55:31 +000090g(1, d=4, **d)
Tim Peters08dabf02001-01-21 18:52:02 +000091print sortdict(d)
92print sortdict(d2)
Marc-André Lemburg36619082001-01-17 19:11:13 +000093verify(d == d2, "function call modified dictionary")
Jeremy Hylton074c3e62000-03-30 23:55:31 +000094
95# what about willful misconduct?
96def saboteur(**kw):
Vladimir Marangozov5ff2ac22000-07-15 00:42:09 +000097 kw['x'] = locals() # yields a cyclic kw
98 return kw
Jeremy Hylton074c3e62000-03-30 23:55:31 +000099d = {}
Vladimir Marangozov5ff2ac22000-07-15 00:42:09 +0000100kw = saboteur(a=1, **d)
Marc-André Lemburg36619082001-01-17 19:11:13 +0000101verify(d == {})
Vladimir Marangozov5ff2ac22000-07-15 00:42:09 +0000102# break the cycle
103del kw['x']
Fred Drake004d5e62000-10-23 17:22:08 +0000104
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +0000105try:
106 g(1, 2, 3, **{'x':4, 'y':5})
107except TypeError, err:
108 print err
109else:
110 print "should raise TypeError: keyword parameter redefined"
Fred Drake004d5e62000-10-23 17:22:08 +0000111
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +0000112try:
113 g(1, 2, 3, a=4, b=5, *(6, 7), **{'a':8, 'b':9})
114except TypeError, err:
115 print err
116else:
117 print "should raise TypeError: keyword parameter redefined"
118
119try:
120 f(**{1:2})
121except TypeError, err:
122 print err
123else:
124 print "should raise TypeError: keywords must be strings"
125
126try:
127 h(**{'e': 2})
128except TypeError, err:
129 print err
130else:
131 print "should raise TypeError: unexpected keyword argument: e"
132
133try:
134 h(*h)
135except TypeError, err:
136 print err
137else:
138 print "should raise TypeError: * argument must be a tuple"
139
140try:
Jeremy Hyltonceccc3c2001-04-11 13:53:35 +0000141 dir(*h)
142except TypeError, err:
143 print err
144else:
145 print "should raise TypeError: * argument must be a tuple"
146
147try:
148 None(*h)
149except TypeError, err:
150 print err
151else:
152 print "should raise TypeError: * argument must be a tuple"
153
154try:
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +0000155 h(**h)
156except TypeError, err:
157 print err
158else:
159 print "should raise TypeError: ** argument must be a dictionary"
160
Jeremy Hyltonceccc3c2001-04-11 13:53:35 +0000161try:
162 dir(**h)
163except TypeError, err:
164 print err
165else:
166 print "should raise TypeError: ** argument must be a dictionary"
167
168try:
169 None(**h)
170except TypeError, err:
171 print err
172else:
173 print "should raise TypeError: ** argument must be a dictionary"
174
175try:
176 dir(b=1,**{'b':1})
177except TypeError, err:
178 print err
179else:
180 print "should raise TypeError: dir() got multiple values for keyword argument 'b'"
181
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +0000182def f2(*a, **b):
183 return a, b
184
185d = {}
186for i in range(512):
187 key = 'k%d' % i
188 d[key] = i
189a, b = f2(1, *(2, 3), **d)
190print len(a), len(b), b == d
Jeremy Hylton6b4ec512000-10-30 17:15:20 +0000191
192class Foo:
193 def method(self, arg1, arg2):
194 return arg1 + arg2
195
196x = Foo()
197print Foo.method(*(x, 1, 2))
198print Foo.method(x, *(1, 2))
199try:
200 print Foo.method(*(1, 2, 3))
201except TypeError, err:
202 print err
203try:
204 print Foo.method(1, *(2, 3))
205except TypeError, err:
206 print err
207
Fred Drake1a7aab72001-01-04 22:33:02 +0000208# A PyCFunction that takes only positional parameters should allow an
209# empty keyword dictionary to pass without a complaint, but raise a
210# TypeError if the dictionary is non-empty.
211id(1, **{})
212try:
213 id(1, **{"foo": 1})
214except TypeError:
215 pass
216else:
217 raise TestFailed, 'expected TypeError; no exception raised'
Ka-Ping Yee20579702001-01-15 22:14:16 +0000218
219a, b, d, e, v, k = 'A', 'B', 'D', 'E', 'V', 'K'
220funcs = []
221maxargs = {}
222for args in ['', 'a', 'ab']:
223 for defargs in ['', 'd', 'de']:
224 for vararg in ['', 'v']:
225 for kwarg in ['', 'k']:
226 name = 'z' + args + defargs + vararg + kwarg
227 arglist = list(args) + map(
228 lambda x: '%s="%s"' % (x, x), defargs)
229 if vararg: arglist.append('*' + vararg)
230 if kwarg: arglist.append('**' + kwarg)
231 decl = 'def %s(%s): print "ok %s", a, b, d, e, v, k' % (
Eric S. Raymondfc170b12001-02-09 11:51:27 +0000232 name, ', '.join(arglist), name)
Ka-Ping Yee20579702001-01-15 22:14:16 +0000233 exec(decl)
234 func = eval(name)
235 funcs.append(func)
236 maxargs[func] = len(args + defargs)
237
238for name in ['za', 'zade', 'zabk', 'zabdv', 'zabdevk']:
239 func = eval(name)
240 for args in [(), (1, 2), (1, 2, 3, 4, 5)]:
241 for kwargs in ['', 'a', 'd', 'ad', 'abde']:
242 kwdict = {}
243 for k in kwargs: kwdict[k] = k + k
Tim Peters08dabf02001-01-21 18:52:02 +0000244 print func.func_name, args, sortdict(kwdict), '->',
Ka-Ping Yee20579702001-01-15 22:14:16 +0000245 try: apply(func, args, kwdict)
246 except TypeError, err: print err