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