mirror of
https://github.com/python/cpython.git
synced 2024-11-26 11:24:40 +08:00
0289b15820
svn+ssh://pythondev@svn.python.org/python/trunk ........ r73004 | jeffrey.yasskin | 2009-05-28 22:44:31 -0500 (Thu, 28 May 2009) | 5 lines Fix nearly all compilation warnings under Apple gcc-4.0. Tested with OPT="-g -Wall -Wstrict-prototypes -Werror" in both --with-pydebug mode and --without. There's still a batch of non-prototype warnings in Xlib.h that I don't know how to fix. ........ r73439 | benjamin.peterson | 2009-06-15 19:29:31 -0500 (Mon, 15 Jun 2009) | 1 line don't mask encoding errors when decoding a string #6289 ........ r73496 | vinay.sajip | 2009-06-21 12:37:27 -0500 (Sun, 21 Jun 2009) | 1 line Issue #6314: logging.basicConfig() performs extra checks on the "level" argument. ........ r73509 | amaury.forgeotdarc | 2009-06-22 14:33:48 -0500 (Mon, 22 Jun 2009) | 2 lines #4490 Fix sample code run by "python -m xml.sax.xmlreader" ........ r73529 | r.david.murray | 2009-06-23 13:02:46 -0500 (Tue, 23 Jun 2009) | 4 lines Fix issue 5230 by having pydoc's safeimport check to see if the import error was thrown from itself in order to decide if the module can't be found. Thanks to Lucas Prado Melo for collaborating on the fix and tests. ........ r73564 | amaury.forgeotdarc | 2009-06-25 17:29:29 -0500 (Thu, 25 Jun 2009) | 6 lines #2016 Fix a crash in function call when the **kwargs dictionary is mutated during the function call setup. This even gives a slight speedup, probably because tuple allocation is faster than PyMem_NEW. ........ r73576 | benjamin.peterson | 2009-06-26 18:37:06 -0500 (Fri, 26 Jun 2009) | 1 line document is_declared_global() ........ r73577 | benjamin.peterson | 2009-06-27 09:16:23 -0500 (Sat, 27 Jun 2009) | 1 line link to extensive generator docs in the reference manual ........ r73595 | ezio.melotti | 2009-06-27 18:45:39 -0500 (Sat, 27 Jun 2009) | 1 line stmt and setup can contain multiple statements, see #5896 ........ r73596 | ezio.melotti | 2009-06-27 19:07:45 -0500 (Sat, 27 Jun 2009) | 1 line Fixed a wrong apostrophe ........ r73605 | georg.brandl | 2009-06-28 07:10:18 -0500 (Sun, 28 Jun 2009) | 1 line Remove stray pychecker directive. ........
274 lines
6.3 KiB
Python
274 lines
6.3 KiB
Python
"""Doctest for method/function calls.
|
|
|
|
We're going the use these types for extra testing
|
|
|
|
>>> from collections import UserList
|
|
>>> from collections import UserDict
|
|
|
|
We're defining four helper functions
|
|
|
|
>>> def e(a,b):
|
|
... print(a, b)
|
|
|
|
>>> def f(*a, **k):
|
|
... print(a, support.sortdict(k))
|
|
|
|
>>> def g(x, *y, **z):
|
|
... print(x, y, support.sortdict(z))
|
|
|
|
>>> def h(j=1, a=2, h=3):
|
|
... print(j, a, h)
|
|
|
|
Argument list examples
|
|
|
|
>>> f()
|
|
() {}
|
|
>>> f(1)
|
|
(1,) {}
|
|
>>> f(1, 2)
|
|
(1, 2) {}
|
|
>>> f(1, 2, 3)
|
|
(1, 2, 3) {}
|
|
>>> f(1, 2, 3, *(4, 5))
|
|
(1, 2, 3, 4, 5) {}
|
|
>>> f(1, 2, 3, *[4, 5])
|
|
(1, 2, 3, 4, 5) {}
|
|
>>> f(1, 2, 3, *UserList([4, 5]))
|
|
(1, 2, 3, 4, 5) {}
|
|
|
|
Here we add keyword arguments
|
|
|
|
>>> f(1, 2, 3, **{'a':4, 'b':5})
|
|
(1, 2, 3) {'a': 4, 'b': 5}
|
|
>>> f(1, 2, 3, *[4, 5], **{'a':6, 'b':7})
|
|
(1, 2, 3, 4, 5) {'a': 6, 'b': 7}
|
|
>>> f(1, 2, 3, x=4, y=5, *(6, 7), **{'a':8, 'b': 9})
|
|
(1, 2, 3, 6, 7) {'a': 8, 'b': 9, 'x': 4, 'y': 5}
|
|
|
|
>>> f(1, 2, 3, **UserDict(a=4, b=5))
|
|
(1, 2, 3) {'a': 4, 'b': 5}
|
|
>>> f(1, 2, 3, *(4, 5), **UserDict(a=6, b=7))
|
|
(1, 2, 3, 4, 5) {'a': 6, 'b': 7}
|
|
>>> f(1, 2, 3, x=4, y=5, *(6, 7), **UserDict(a=8, b=9))
|
|
(1, 2, 3, 6, 7) {'a': 8, 'b': 9, 'x': 4, 'y': 5}
|
|
|
|
Examples with invalid arguments (TypeErrors). We're also testing the function
|
|
names in the exception messages.
|
|
|
|
Verify clearing of SF bug #733667
|
|
|
|
>>> e(c=4)
|
|
Traceback (most recent call last):
|
|
...
|
|
TypeError: e() got an unexpected keyword argument 'c'
|
|
|
|
>>> g()
|
|
Traceback (most recent call last):
|
|
...
|
|
TypeError: g() takes at least 1 positional argument (0 given)
|
|
|
|
>>> g(*())
|
|
Traceback (most recent call last):
|
|
...
|
|
TypeError: g() takes at least 1 positional argument (0 given)
|
|
|
|
>>> g(*(), **{})
|
|
Traceback (most recent call last):
|
|
...
|
|
TypeError: g() takes at least 1 positional argument (0 given)
|
|
|
|
>>> g(1)
|
|
1 () {}
|
|
>>> g(1, 2)
|
|
1 (2,) {}
|
|
>>> g(1, 2, 3)
|
|
1 (2, 3) {}
|
|
>>> g(1, 2, 3, *(4, 5))
|
|
1 (2, 3, 4, 5) {}
|
|
|
|
>>> class Nothing: pass
|
|
...
|
|
>>> g(*Nothing())
|
|
Traceback (most recent call last):
|
|
...
|
|
TypeError: g() argument after * must be a sequence, not Nothing
|
|
|
|
>>> class Nothing:
|
|
... def __len__(self): return 5
|
|
...
|
|
|
|
>>> g(*Nothing())
|
|
Traceback (most recent call last):
|
|
...
|
|
TypeError: g() argument after * must be a sequence, not Nothing
|
|
|
|
>>> class Nothing():
|
|
... def __len__(self): return 5
|
|
... def __getitem__(self, i):
|
|
... if i<3: return i
|
|
... else: raise IndexError(i)
|
|
...
|
|
|
|
>>> g(*Nothing())
|
|
0 (1, 2) {}
|
|
|
|
>>> class Nothing:
|
|
... def __init__(self): self.c = 0
|
|
... def __iter__(self): return self
|
|
... def __next__(self):
|
|
... if self.c == 4:
|
|
... raise StopIteration
|
|
... c = self.c
|
|
... self.c += 1
|
|
... return c
|
|
...
|
|
|
|
>>> g(*Nothing())
|
|
0 (1, 2, 3) {}
|
|
|
|
Make sure that the function doesn't stomp the dictionary
|
|
|
|
>>> d = {'a': 1, 'b': 2, 'c': 3}
|
|
>>> d2 = d.copy()
|
|
>>> g(1, d=4, **d)
|
|
1 () {'a': 1, 'b': 2, 'c': 3, 'd': 4}
|
|
>>> d == d2
|
|
True
|
|
|
|
What about willful misconduct?
|
|
|
|
>>> def saboteur(**kw):
|
|
... kw['x'] = 'm'
|
|
... return kw
|
|
|
|
>>> d = {}
|
|
>>> kw = saboteur(a=1, **d)
|
|
>>> d
|
|
{}
|
|
|
|
|
|
>>> g(1, 2, 3, **{'x': 4, 'y': 5})
|
|
Traceback (most recent call last):
|
|
...
|
|
TypeError: g() got multiple values for keyword argument 'x'
|
|
|
|
>>> f(**{1:2})
|
|
Traceback (most recent call last):
|
|
...
|
|
TypeError: f() keywords must be strings
|
|
|
|
>>> h(**{'e': 2})
|
|
Traceback (most recent call last):
|
|
...
|
|
TypeError: h() got an unexpected keyword argument 'e'
|
|
|
|
>>> h(*h)
|
|
Traceback (most recent call last):
|
|
...
|
|
TypeError: h() argument after * must be a sequence, not function
|
|
|
|
>>> dir(*h)
|
|
Traceback (most recent call last):
|
|
...
|
|
TypeError: dir() argument after * must be a sequence, not function
|
|
|
|
>>> None(*h)
|
|
Traceback (most recent call last):
|
|
...
|
|
TypeError: NoneType object argument after * must be a sequence, \
|
|
not function
|
|
|
|
>>> h(**h)
|
|
Traceback (most recent call last):
|
|
...
|
|
TypeError: h() argument after ** must be a mapping, not function
|
|
|
|
>>> dir(**h)
|
|
Traceback (most recent call last):
|
|
...
|
|
TypeError: dir() argument after ** must be a mapping, not function
|
|
|
|
>>> None(**h)
|
|
Traceback (most recent call last):
|
|
...
|
|
TypeError: NoneType object argument after ** must be a mapping, \
|
|
not function
|
|
|
|
>>> dir(b=1, **{'b': 1})
|
|
Traceback (most recent call last):
|
|
...
|
|
TypeError: dir() got multiple values for keyword argument 'b'
|
|
|
|
Another helper function
|
|
|
|
>>> def f2(*a, **b):
|
|
... return a, b
|
|
|
|
|
|
>>> d = {}
|
|
>>> for i in range(512):
|
|
... key = 'k%d' % i
|
|
... d[key] = i
|
|
>>> a, b = f2(1, *(2,3), **d)
|
|
>>> len(a), len(b), b == d
|
|
(3, 512, True)
|
|
|
|
>>> class Foo:
|
|
... def method(self, arg1, arg2):
|
|
... return arg1+arg2
|
|
|
|
>>> x = Foo()
|
|
>>> Foo.method(*(x, 1, 2))
|
|
3
|
|
>>> Foo.method(x, *(1, 2))
|
|
3
|
|
>>> Foo.method(*(1, 2, 3))
|
|
5
|
|
>>> Foo.method(1, *[2, 3])
|
|
5
|
|
|
|
A PyCFunction that takes only positional parameters shoud allow an
|
|
empty keyword dictionary to pass without a complaint, but raise a
|
|
TypeError if te dictionary is not empty
|
|
|
|
>>> try:
|
|
... silence = id(1, *{})
|
|
... True
|
|
... except:
|
|
... False
|
|
True
|
|
|
|
>>> id(1, **{'foo': 1})
|
|
Traceback (most recent call last):
|
|
...
|
|
TypeError: id() takes no keyword arguments
|
|
|
|
A corner case of keyword dictionary items being deleted during
|
|
the function call setup. See <http://bugs.python.org/issue2016>.
|
|
|
|
>>> class Name(str):
|
|
... def __eq__(self, other):
|
|
... try:
|
|
... del x[self]
|
|
... except KeyError:
|
|
... pass
|
|
... return str.__eq__(self, other)
|
|
... def __hash__(self):
|
|
... return str.__hash__(self)
|
|
|
|
>>> x = {Name("a"):1, Name("b"):2}
|
|
>>> def f(a, b):
|
|
... print(a,b)
|
|
>>> f(**x)
|
|
1 2
|
|
"""
|
|
|
|
from test import support
|
|
|
|
def test_main():
|
|
from test import test_extcall # self import
|
|
support.run_doctest(test_extcall, True)
|
|
|
|
if __name__ == '__main__':
|
|
test_main()
|