5
d = dict(zip(range(10,dict_size+10), range(dict_size)))
8
def dict_iteritems(dict d):
10
>>> it = dict_iteritems(d)
14
[(10, 0), (11, 1), (12, 2), (13, 3)]
19
def dict_iterkeys(dict d):
21
>>> it = dict_iterkeys(d)
30
def dict_itervalues(dict d):
32
>>> it = dict_itervalues(d)
41
@cython.test_fail_if_path_exists(
46
[(10, 0), (11, 1), (12, 2), (13, 3)]
54
@cython.test_assert_path_exists(
56
"//WhileStatNode//DictIterationNextNode")
60
[(10, 0), (11, 1), (12, 2), (13, 3)]
65
for k,v in d.iteritems():
70
@cython.test_assert_path_exists(
72
"//WhileStatNode//DictIterationNextNode")
73
def optimistic_iteritems(d):
75
>>> optimistic_iteritems(d)
76
[(10, 0), (11, 1), (12, 2), (13, 3)]
77
>>> optimistic_iteritems({})
79
>>> class mydict(object):
80
... def __init__(self, t): self.t = t
81
... def iteritems(self): return self.t(d.items())
82
>>> optimistic_iteritems(mydict(list))
83
[(10, 0), (11, 1), (12, 2), (13, 3)]
84
>>> optimistic_iteritems(mydict(tuple))
85
[(10, 0), (11, 1), (12, 2), (13, 3)]
86
>>> optimistic_iteritems(mydict(iter))
87
[(10, 0), (11, 1), (12, 2), (13, 3)]
90
for k,v in d.iteritems():
95
@cython.test_assert_path_exists(
97
"//WhileStatNode//DictIterationNextNode")
101
[(11, 1), (12, 2), (13, 3)]
104
for k,v in {11 : 1, 12 : 2, 13 : 3}.iteritems():
109
@cython.test_assert_path_exists(
111
"//WhileStatNode//DictIterationNextNode")
112
def iteritems_int(dict d):
115
[(10, 0), (11, 1), (12, 2), (13, 3)]
116
>>> iteritems_int({})
118
>>> iteritems_int({'a': 1})
119
Traceback (most recent call last):
120
TypeError: an integer is required
121
>>> iteritems_int({1: 'b'})
122
Traceback (most recent call last):
123
TypeError: an integer is required
124
>>> iteritems_int({'a': 'b'})
125
Traceback (most recent call last):
126
TypeError: an integer is required
130
for k,v in d.iteritems():
135
@cython.test_assert_path_exists(
137
"//WhileStatNode//DictIterationNextNode")
138
def optimistic_iteritems_int(d):
140
>>> optimistic_iteritems_int(d)
141
[(10, 0), (11, 1), (12, 2), (13, 3)]
142
>>> optimistic_iteritems_int({})
144
>>> class mydict(object):
145
... def __init__(self, t): self.t = t
146
... def iteritems(self): return self.t(d.items())
147
>>> optimistic_iteritems_int(mydict(list))
148
[(10, 0), (11, 1), (12, 2), (13, 3)]
149
>>> optimistic_iteritems_int(mydict(tuple))
150
[(10, 0), (11, 1), (12, 2), (13, 3)]
151
>>> optimistic_iteritems_int(mydict(iter))
152
[(10, 0), (11, 1), (12, 2), (13, 3)]
154
>>> optimistic_iteritems_int({'a': 1})
155
Traceback (most recent call last):
156
TypeError: an integer is required
157
>>> optimistic_iteritems_int({1: 'b'})
158
Traceback (most recent call last):
159
TypeError: an integer is required
160
>>> optimistic_iteritems_int({'a': 'b'})
161
Traceback (most recent call last):
162
TypeError: an integer is required
166
for k,v in d.iteritems():
171
@cython.test_assert_path_exists(
173
"//WhileStatNode//DictIterationNextNode")
174
def iteritems_tuple(dict d):
176
>>> iteritems_tuple(d)
177
[(10, 0), (11, 1), (12, 2), (13, 3)]
178
>>> iteritems_tuple({})
182
for t in d.iteritems():
187
@cython.test_assert_path_exists(
189
"//WhileStatNode//DictIterationNextNode")
190
def iteritems_listcomp(dict d):
191
cdef list l = [(k,v) for k,v in d.iteritems()]
195
@cython.test_assert_path_exists(
197
"//WhileStatNode//DictIterationNextNode")
206
for k in d.iterkeys():
211
@cython.test_assert_path_exists(
213
"//WhileStatNode//DictIterationNextNode")
214
def optimistic_iterkeys(d):
216
>>> optimistic_iterkeys(d)
218
>>> optimistic_iterkeys({})
220
>>> class mydict(object):
221
... def __init__(self, t): self.t = t
222
... def iterkeys(self): return self.t(d)
223
>>> optimistic_iterkeys(mydict(lambda x:x))
225
>>> optimistic_iterkeys(mydict(lambda x:x.keys()))
227
>>> optimistic_iterkeys(mydict(list))
229
>>> optimistic_iterkeys(mydict(tuple))
231
>>> optimistic_iterkeys(mydict(iter))
235
for k in d.iterkeys():
240
@cython.test_fail_if_path_exists(
242
"//WhileStatNode//DictIterationNextNode")
243
def optimistic_iterkeys_argerror(d):
245
>>> try: optimistic_iterkeys_argerror(d)
246
... except (TypeError, AttributeError): pass
248
for k in d.iterkeys(1):
251
@cython.test_assert_path_exists(
253
"//WhileStatNode//DictIterationNextNode")
254
def iterkeys_int(dict d):
260
>>> iterkeys_int({'a': 'b'})
261
Traceback (most recent call last):
262
TypeError: an integer is required
266
for k in d.iterkeys():
271
@cython.test_assert_path_exists(
273
"//WhileStatNode//DictIterationNextNode")
287
@cython.test_assert_path_exists(
289
"//WhileStatNode//DictIterationNextNode")
290
def iterdict_int(dict d):
296
>>> iterdict_int({'a': 'b'})
297
Traceback (most recent call last):
298
TypeError: an integer is required
307
@cython.test_assert_path_exists(
309
"//WhileStatNode//DictIterationNextNode")
310
def iterdict_reassign(dict d):
312
>>> iterdict_reassign(d)
314
>>> iterdict_reassign({})
325
@cython.test_assert_path_exists(
327
"//WhileStatNode//DictIterationNextNode")
328
def iterdict_listcomp(dict d):
330
>>> iterdict_listcomp(d)
332
>>> iterdict_listcomp({})
335
cdef list l = [k for k in d]
339
@cython.test_assert_path_exists(
341
"//WhileStatNode//DictIterationNextNode")
342
def itervalues(dict d):
350
for v in d.itervalues():
355
@cython.test_assert_path_exists(
357
"//WhileStatNode//DictIterationNextNode")
358
def optimistic_itervalues(d):
360
>>> optimistic_itervalues(d)
362
>>> optimistic_itervalues({})
364
>>> class mydict(object):
365
... def __init__(self, t): self.t = t
366
... def itervalues(self): return self.t(d.values())
367
>>> optimistic_itervalues(mydict(lambda x:x))
369
>>> optimistic_itervalues(mydict(list))
371
>>> optimistic_itervalues(mydict(tuple))
373
>>> optimistic_itervalues(mydict(iter))
377
for v in d.itervalues():
382
@cython.test_assert_path_exists(
384
"//WhileStatNode//DictIterationNextNode")
385
def itervalues_int(dict d):
387
>>> itervalues_int(d)
389
>>> itervalues_int({})
391
>>> itervalues_int({'a': 'b'})
392
Traceback (most recent call last):
393
TypeError: an integer is required
397
for v in d.itervalues():
402
@cython.test_assert_path_exists(
404
"//WhileStatNode//DictIterationNextNode")
405
def itervalues_listcomp(dict d):
407
>>> itervalues_listcomp(d)
409
>>> itervalues_listcomp({})
412
cdef list l = [v for v in d.itervalues()]
416
@cython.test_assert_path_exists(
418
"//WhileStatNode//DictIterationNextNode")
419
def itervalues_kwargs(**d):
421
>>> itervalues_kwargs(a=1, b=2, c=3, d=4)
423
>>> itervalues_kwargs()
426
cdef list l = [v for v in d.itervalues()]
430
@cython.test_assert_path_exists(
432
"//WhileStatNode//DictIterationNextNode")
433
def iterdict_change_size(dict d):
442
Traceback (most recent call last):
443
RuntimeError: dictionary changed size during iteration
445
>>> iterdict_change_size({1:2, 10:20})
446
Traceback (most recent call last):
447
RuntimeError: dictionary changed size during iteration
448
>>> print( iterdict_change_size({}) )
460
@cython.test_assert_path_exists(
462
"//WhileStatNode//DictIterationNextNode")
463
def optimistic_iterdict_change_size(d):
472
Traceback (most recent call last):
473
RuntimeError: dictionary changed size during iteration
475
>>> optimistic_iterdict_change_size({1:2, 10:20})
476
Traceback (most recent call last):
477
RuntimeError: dictionary changed size during iteration
478
>>> print( optimistic_iterdict_change_size({}) )
480
>>> class mydict(object):
481
... _d = {1:2, 10:20}
482
... def iterkeys(self): return self._d
483
... def __setitem__(self, key, value): self._d[key] = value
484
>>> optimistic_iterdict_change_size(mydict())
485
Traceback (most recent call last):
486
RuntimeError: dictionary changed size during iteration
490
for i in d.iterkeys():
498
@cython.test_assert_path_exists(
500
"//WhileStatNode//DictIterationNextNode")
501
def values_of_expression(**kwargs):
503
>>> sorted(values_of_expression(a=3, b=4))
506
# this can be optimised even in Py2
507
return [ arg for arg in dict(kwargs.items()).values() ]
510
def items_of_expression(*args, **kwargs):
512
>>> sorted(items_of_expression(a=3, b=4))
515
>>> sorted(items_of_expression([('a', 3)], b=4))
518
return [item for item in dict(*args, **kwargs).items()]
521
def iteritems_of_expression(*args, **kwargs):
523
>>> sorted(iteritems_of_expression(a=3, b=4))
526
>>> sorted(iteritems_of_expression([('a', 3)], b=4))
529
return [item for item in dict(*args, **kwargs).iteritems()]
532
def for_in_items_of_expression(*args, **kwargs):
534
>>> sorted(for_in_items_of_expression(a=3, b=4))
537
>>> sorted(for_in_items_of_expression([('a', 3)], b=4))
541
for k, v in dict(*args, **kwargs).items():
542
result.append((k, v))
546
def for_in_iteritems_of_expression(*args, **kwargs):
548
>>> sorted(for_in_iteritems_of_expression(a=3, b=4))
551
>>> sorted(for_in_iteritems_of_expression([('a', 3)], b=4))
555
for k, v in dict(*args, **kwargs).iteritems():
556
result.append((k, v))
562
>>> NotADict().listvalues() # doctest: +IGNORE_EXCEPTION_DETAIL
563
Traceback (most recent call last):
565
TypeError: descriptor 'values' for 'mappingproxy' objects doesn't apply to a 'iterdict.NotADict' object
570
itervalues = type(object.__dict__).values
572
def listvalues(self):
573
return [v for v in self.itervalues()]