mirror of
https://github.com/python/cpython.git
synced 2025-08-04 17:08:35 +00:00
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).
This commit is contained in:
parent
1b8ca0d87a
commit
25786c0851
2 changed files with 80 additions and 3 deletions
|
@ -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()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue