1# mode: run 2# tag: dict, getitem 3 4cimport cython 5 6def test(dict d, index): 7 """ 8 >>> d = { 1: 10 } 9 >>> test(d, 1) 10 10 11 12 >>> test(d, 2) 13 Traceback (most recent call last): 14 KeyError: 2 15 16 >>> test(d, (1,2)) 17 Traceback (most recent call last): 18 KeyError: (1, 2) 19 20 >>> import sys 21 >>> try: d[(1,)] 22 ... except KeyError: 23 ... args = sys.exc_info()[1].args 24 ... if sys.version_info >= (2,5): print(args) 25 ... else: print((args,)) # fake it for older CPython versions 26 ((1,),) 27 28 >>> import sys 29 >>> try: test(d, (1,)) 30 ... except KeyError: 31 ... args = sys.exc_info()[1].args 32 ... if sys.version_info >= (2,5): print(args) 33 ... else: print((args,)) # fake it for older CPython versions 34 ((1,),) 35 36 >>> class Unhashable: 37 ... def __hash__(self): 38 ... raise ValueError 39 >>> test(d, Unhashable()) 40 Traceback (most recent call last): 41 ValueError 42 43 >>> test(None, 1) # doctest: +ELLIPSIS 44 Traceback (most recent call last): 45 TypeError: ...object... 46 """ 47 return d[index] 48 49 50def getitem_str(dict d, obj, str index): 51 """ 52 >>> d = {'abc': 1, 'xyz': 2, None: 3} 53 >>> getitem_str(d, d, 'abc') 54 (1, 1) 55 >>> getitem_str(d, d, 'xyz') 56 (2, 2) 57 >>> getitem_str(d, d, None) 58 (3, 3) 59 60 >>> class GetItem(object): 61 ... def __getitem__(self, name): return d[name] 62 >>> getitem_str(d, GetItem(), 'abc') 63 (1, 1) 64 >>> getitem_str(d, GetItem(), 'xyz') 65 (2, 2) 66 >>> getitem_str(d, GetItem(), None) 67 (3, 3) 68 >>> getitem_str(d, GetItem(), 'no') 69 Traceback (most recent call last): 70 KeyError: 'no' 71 72 >>> class GetItemFail(object): 73 ... def __getitem__(self, name): raise ValueError("failed") 74 >>> getitem_str(d, GetItemFail(), 'abc') 75 Traceback (most recent call last): 76 ValueError: failed 77 >>> getitem_str(d, GetItemFail(), None) 78 Traceback (most recent call last): 79 ValueError: failed 80 """ 81 return d[index], obj[index] 82 83 84def getitem_unicode(dict d, obj, unicode index): 85 """ 86 >>> d = {'abc': 1, 'xyz': 2, None: 3} 87 >>> getitem_unicode(d, d, u'abc') 88 (1, 1) 89 >>> getitem_unicode(d, d, u'xyz') 90 (2, 2) 91 >>> getitem_unicode(d, d, None) 92 (3, 3) 93 94 >>> class GetItem(object): 95 ... def __getitem__(self, name): return d[name] 96 >>> getitem_unicode(d, GetItem(), u'abc') 97 (1, 1) 98 >>> getitem_unicode(d, GetItem(), u'xyz') 99 (2, 2) 100 >>> getitem_unicode(d, GetItem(), None) 101 (3, 3) 102 >>> try: getitem_unicode(d, GetItem(), u'no') 103 ... except KeyError as exc: assert exc.args[0] == u'no', str(exc) 104 ... else: assert False, "KeyError not raised" 105 106 >>> class GetItemFail(object): 107 ... def __getitem__(self, name): raise ValueError("failed") 108 >>> getitem_unicode(d, GetItemFail(), u'abc') 109 Traceback (most recent call last): 110 ValueError: failed 111 """ 112 return d[index], obj[index] 113 114 115def getitem_tuple(dict d, index): 116 """ 117 >>> d = {1: 1, (1,): 2} 118 >>> getitem_tuple(d, 1) 119 (1, 2) 120 """ 121 return d[index], d[index,] 122 123 124def getitem_in_condition(dict d, key, expected_result): 125 """ 126 >>> d = dict(a=1, b=2) 127 >>> getitem_in_condition(d, 'a', 1) 128 True 129 """ 130 return d[key] is expected_result or d[key] == expected_result 131 132 133@cython.test_fail_if_path_exists('//NoneCheckNode') 134def getitem_not_none(dict d not None, key): 135 """ 136 >>> d = { 1: 10 } 137 >>> test(d, 1) 138 10 139 140 >>> test(d, 2) 141 Traceback (most recent call last): 142 KeyError: 2 143 144 >>> test(d, (1,2)) 145 Traceback (most recent call last): 146 KeyError: (1, 2) 147 """ 148 return d[key] 149