diff options
author | Tim Peters <tim.peters@gmail.com> | 2001-09-02 08:22:48 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2001-09-02 08:22:48 (GMT) |
commit | 25786c0851da8665bdbba948ddb16b23a040bbb2 (patch) | |
tree | 6bbe5fef549dc5105b642567c9ce1e0e87a0b94f /Lib | |
parent | 1b8ca0d87a806a5098496ad4864a975707cd6bac (diff) | |
download | cpython-25786c0851da8665bdbba948ddb16b23a040bbb2.zip cpython-25786c0851da8665bdbba948ddb16b23a040bbb2.tar.gz cpython-25786c0851da8665bdbba948ddb16b23a040bbb2.tar.bz2 |
Make dictionary() a real constructor. Accepts at most one argument, "a
mapping object", in the same sense dict.update(x) requires of x (that x
has a keys() method and a getitem).
Questionable: The other type constructors accept a keyword argument, so I
did that here too (e.g., dictionary(mapping={1:2}) works). But type_call
doesn't pass the keyword args to the tp_new slot (it passes NULL), it only
passes them to the tp_init slot, so getting at them required adding a
tp_init slot to dicts. Looks like that makes the normal case (i.e., no
args at all) a little slower (the time it takes to call dict.tp_init and
have it figure out there's nothing to do).
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_descr.py | 52 |
1 files changed, 51 insertions, 1 deletions
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index f495a37..f6b9e1b 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -1,6 +1,6 @@ # Test descriptor-related enhancements -from test_support import verify, verbose +from test_support import verify, verbose, TestFailed from copy import deepcopy def testunop(a, res, expr="len(a)", meth="__len__"): @@ -123,6 +123,55 @@ def dicts(): verify(eval(d.__repr__(), {}) == d) testset2op({1:2,3:4}, 2, 3, {1:2,2:3,3:4}, "a[b]=c", "__setitem__") +def dict_constructor(): + if verbose: + print "Testing dictionary constructor ..." + d = dictionary() + verify(d == {}) + d = dictionary({}) + verify(d == {}) + d = dictionary(mapping={}) + verify(d == {}) + d = dictionary({1: 2, 'a': 'b'}) + verify(d == {1: 2, 'a': 'b'}) + for badarg in 0, 0L, 0j, "0", [0], (0,): + try: + dictionary(badarg) + except TypeError: + pass + else: + raise TestFailed("no TypeError from dictionary(%r)" % badarg) + try: + dictionary(senseless={}) + except TypeError: + pass + else: + raise TestFailed("no TypeError from dictionary(senseless={}") + + try: + dictionary({}, {}) + except TypeError: + pass + else: + raise TestFailed("no TypeError from dictionary({}, {})") + + class Mapping: + dict = {1:2, 3:4, 'a':1j} + + def __getitem__(self, i): + return self.dict[i] + + try: + dictionary(Mapping()) + except TypeError: + pass + else: + raise TestFailed("no TypeError from dictionary(incomplete mapping)") + + Mapping.keys = lambda self: self.dict.keys() + d = dictionary(mapping=Mapping()) + verify(d == Mapping.dict) + binops = { 'add': '+', 'sub': '-', @@ -1299,6 +1348,7 @@ def inherits(): def all(): lists() dicts() + dict_constructor() ints() longs() floats() |