blob: 10162aaa647a12bc5f98ca0793efc4e1d52eafd2 [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
Ka-Ping Yee20579702001-01-15 22:14:16 +00003import string
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +00004
Tim Peters08dabf02001-01-21 18:52:02 +00005def sortdict(d):
6 keys = d.keys()
7 keys.sort()
8 lst = []
9 for k in keys:
10 lst.append("%r: %r" % (k, d[k]))
11 return "{%s}" % ", ".join(lst)
12
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000013def f(*a, **k):
Tim Peters08dabf02001-01-21 18:52:02 +000014 print a, sortdict(k)
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000015
16def g(x, *y, **z):
Tim Peters08dabf02001-01-21 18:52:02 +000017 print x, y, sortdict(z)
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000018
19def h(j=1, a=2, h=3):
20 print j, a, h
21
22f()
23f(1)
24f(1, 2)
25f(1, 2, 3)
26
27f(1, 2, 3, *(4, 5))
28f(1, 2, 3, *[4, 5])
Jeremy Hylton003663d2000-03-28 23:53:22 +000029f(1, 2, 3, *UserList([4, 5]))
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000030f(1, 2, 3, **{'a':4, 'b':5})
31f(1, 2, 3, *(4, 5), **{'a':6, 'b':7})
32f(1, 2, 3, x=4, y=5, *(6, 7), **{'a':8, 'b':9})
33
34try:
35 g()
36except TypeError, err:
37 print "TypeError:", err
38else:
39 print "should raise TypeError: not enough arguments; expected 1, got 0"
Fred Drake004d5e62000-10-23 17:22:08 +000040
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000041try:
42 g(*())
43except TypeError, err:
44 print "TypeError:", err
45else:
46 print "should raise TypeError: not enough arguments; expected 1, got 0"
Fred Drake004d5e62000-10-23 17:22:08 +000047
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000048try:
49 g(*(), **{})
50except TypeError, err:
51 print "TypeError:", err
52else:
53 print "should raise TypeError: not enough arguments; expected 1, got 0"
Fred Drake004d5e62000-10-23 17:22:08 +000054
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +000055g(1)
56g(1, 2)
57g(1, 2, 3)
58g(1, 2, 3, *(4, 5))
Jeremy Hylton074c3e62000-03-30 23:55:31 +000059class Nothing: pass
60try:
61 g(*Nothing())
62except AttributeError, attr:
Guido van Rossum4b491012000-04-10 13:37:14 +000063 pass
Jeremy Hylton074c3e62000-03-30 23:55:31 +000064else:
65 print "should raise AttributeError: __len__"
66
67class Nothing:
68 def __len__(self):
69 return 5
70try:
71 g(*Nothing())
72except AttributeError, attr:
Guido van Rossum4b491012000-04-10 13:37:14 +000073 pass
Jeremy Hylton074c3e62000-03-30 23:55:31 +000074else:
75 print "should raise AttributeError: __getitem__"
Fred Drake004d5e62000-10-23 17:22:08 +000076
Jeremy Hylton074c3e62000-03-30 23:55:31 +000077class Nothing:
78 def __len__(self):
79 return 5
80 def __getitem__(self, i):
81 if i < 3:
82 return i
83 else:
84 raise IndexError, i
85g(*Nothing())
86
87# make sure the function call doesn't stomp on the dictionary?
88d = {'a': 1, 'b': 2, 'c': 3}
89d2 = d.copy()
Marc-André Lemburg36619082001-01-17 19:11:13 +000090verify(d == d2)
Jeremy Hylton074c3e62000-03-30 23:55:31 +000091g(1, d=4, **d)
Tim Peters08dabf02001-01-21 18:52:02 +000092print sortdict(d)
93print sortdict(d2)
Marc-André Lemburg36619082001-01-17 19:11:13 +000094verify(d == d2, "function call modified dictionary")
Jeremy Hylton074c3e62000-03-30 23:55:31 +000095
96# what about willful misconduct?
97def saboteur(**kw):
Vladimir Marangozov5ff2ac22000-07-15 00:42:09 +000098 kw['x'] = locals() # yields a cyclic kw
99 return kw
Jeremy Hylton074c3e62000-03-30 23:55:31 +0000100d = {}
Vladimir Marangozov5ff2ac22000-07-15 00:42:09 +0000101kw = saboteur(a=1, **d)
Marc-André Lemburg36619082001-01-17 19:11:13 +0000102verify(d == {})
Vladimir Marangozov5ff2ac22000-07-15 00:42:09 +0000103# break the cycle
104del kw['x']
Fred Drake004d5e62000-10-23 17:22:08 +0000105
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +0000106try:
107 g(1, 2, 3, **{'x':4, 'y':5})
108except TypeError, err:
109 print err
110else:
111 print "should raise TypeError: keyword parameter redefined"
Fred Drake004d5e62000-10-23 17:22:08 +0000112
Jeremy Hyltonaed0d8d2000-03-28 23:51:17 +0000113try:
114 g(1, 2, 3, a=4, b=5, *(6, 7), **{'a':8, 'b':9})
115except TypeError, err:
116 print err
117else:
118 print "should raise TypeError: keyword parameter redefined"
119
120try:
121 f(**{1:2})
122except TypeError, err:
123 print err
124else:
125 print "should raise TypeError: keywords must be strings"
126
127try:
128 h(**{'e': 2})
129except TypeError, err:
130 print err
131else:
132 print "should raise TypeError: unexpected keyword argument: e"
133
134try:
135 h(*h)
136except TypeError, err:
137 print err
138else:
139 print "should raise TypeError: * argument must be a tuple"
140
141try:
142 h(**h)
143except TypeError, err:
144 print err
145else:
146 print "should raise TypeError: ** argument must be a dictionary"
147
148def f2(*a, **b):
149 return a, b
150
151d = {}
152for i in range(512):
153 key = 'k%d' % i
154 d[key] = i
155a, b = f2(1, *(2, 3), **d)
156print len(a), len(b), b == d
Jeremy Hylton6b4ec512000-10-30 17:15:20 +0000157
158class Foo:
159 def method(self, arg1, arg2):
160 return arg1 + arg2
161
162x = Foo()
163print Foo.method(*(x, 1, 2))
164print Foo.method(x, *(1, 2))
165try:
166 print Foo.method(*(1, 2, 3))
167except TypeError, err:
168 print err
169try:
170 print Foo.method(1, *(2, 3))
171except TypeError, err:
172 print err
173
Fred Drake1a7aab72001-01-04 22:33:02 +0000174# A PyCFunction that takes only positional parameters should allow an
175# empty keyword dictionary to pass without a complaint, but raise a
176# TypeError if the dictionary is non-empty.
177id(1, **{})
178try:
179 id(1, **{"foo": 1})
180except TypeError:
181 pass
182else:
183 raise TestFailed, 'expected TypeError; no exception raised'
Ka-Ping Yee20579702001-01-15 22:14:16 +0000184
185a, b, d, e, v, k = 'A', 'B', 'D', 'E', 'V', 'K'
186funcs = []
187maxargs = {}
188for args in ['', 'a', 'ab']:
189 for defargs in ['', 'd', 'de']:
190 for vararg in ['', 'v']:
191 for kwarg in ['', 'k']:
192 name = 'z' + args + defargs + vararg + kwarg
193 arglist = list(args) + map(
194 lambda x: '%s="%s"' % (x, x), defargs)
195 if vararg: arglist.append('*' + vararg)
196 if kwarg: arglist.append('**' + kwarg)
197 decl = 'def %s(%s): print "ok %s", a, b, d, e, v, k' % (
198 name, string.join(arglist, ', '), name)
199 exec(decl)
200 func = eval(name)
201 funcs.append(func)
202 maxargs[func] = len(args + defargs)
203
204for name in ['za', 'zade', 'zabk', 'zabdv', 'zabdevk']:
205 func = eval(name)
206 for args in [(), (1, 2), (1, 2, 3, 4, 5)]:
207 for kwargs in ['', 'a', 'd', 'ad', 'abde']:
208 kwdict = {}
209 for k in kwargs: kwdict[k] = k + k
Tim Peters08dabf02001-01-21 18:52:02 +0000210 print func.func_name, args, sortdict(kwdict), '->',
Ka-Ping Yee20579702001-01-15 22:14:16 +0000211 try: apply(func, args, kwdict)
212 except TypeError, err: print err