cython

Форк
0
/
for_in_string.pyx 
226 строк · 5.8 Кб
1
cimport cython
2

3
bytes_abc = b'abc'
4
bytes_ABC = b'ABC'
5
bytes_abc_null = b'a\0b\0c'
6
bytes_ABC_null = b'A\0B\0C'
7

8
unicode_abc = u'abc'
9
unicode_ABC = u'ABC'
10
unicode_abc_null = u'a\0b\0c'
11
unicode_ABC_null = u'A\0B\0C'
12

13

14
def for_in_bytes(bytes s):
15
    """
16
    >>> for_in_bytes(bytes_abc)
17
    'X'
18
    >>> for_in_bytes(bytes_ABC)
19
    'C'
20
    >>> for_in_bytes(bytes_abc_null)
21
    'X'
22
    >>> for_in_bytes(bytes_ABC_null)
23
    'C'
24
    """
25
    for c in s:
26
        # Py2/Py3
27
        if c == b'C' or c == c'C':
28
            return 'C'
29
    else:
30
        return 'X'
31

32
@cython.test_assert_path_exists("//ForFromStatNode")
33
@cython.test_fail_if_path_exists("//ForInStatNode")
34
def for_char_in_bytes(bytes s):
35
    """
36
    >>> for_char_in_bytes(bytes_abc)
37
    'X'
38
    >>> for_char_in_bytes(bytes_ABC)
39
    'C'
40
    >>> for_char_in_bytes(bytes_abc_null)
41
    'X'
42
    >>> for_char_in_bytes(bytes_ABC_null)
43
    'C'
44
    """
45
    cdef char c
46
    for c in s:
47
        if c == b'C':
48
            return 'C'
49
    else:
50
        return 'X'
51

52
#### Py2 and Py3 behave differently here: Py2->bytes, Py3->integer
53
##
54
## @cython.test_assert_path_exists("//ForFromStatNode")
55
## @cython.test_fail_if_path_exists("//ForInStatNode")
56
## def for_obj_in_bytes_slice(bytes s):
57
##     """
58
##     >>> for_obj_in_bytes_slice(bytes_abc)
59
##     'X'
60
##     >>> for_obj_in_bytes_slice(bytes_ABC)
61
##     'B'
62
##     >>> for_obj_in_bytes_slice(bytes_abc_null)
63
##     'X'
64
##     >>> for_obj_in_bytes_slice(bytes_ABC_null)
65
##     'B'
66
##     """
67
##     for c in s[1:-1]:
68
##         if c == b'B':
69
##             return 'B'
70
##     else:
71
##         return 'X'
72

73
@cython.test_assert_path_exists("//ForFromStatNode")
74
@cython.test_fail_if_path_exists("//ForInStatNode")
75
def for_char_in_bytes_slice(bytes s):
76
    """
77
    >>> for_char_in_bytes_slice(bytes_abc)
78
    'X'
79
    >>> for_char_in_bytes_slice(bytes_ABC)
80
    'B'
81
    >>> for_char_in_bytes_slice(bytes_abc_null)
82
    'X'
83
    >>> for_char_in_bytes_slice(bytes_ABC_null)
84
    'B'
85
    """
86
    cdef char c
87
    for c in s[1:-1]:
88
        if c == c'B':
89
            return 'B'
90
    else:
91
        return 'X'
92

93
@cython.test_assert_path_exists("//ForFromStatNode")
94
@cython.test_fail_if_path_exists("//ForInStatNode")
95
def for_char_in_enumerate_bytes(bytes s):
96
    """
97
    >>> for_char_in_enumerate_bytes(bytes_abc)
98
    'X'
99
    >>> for_char_in_enumerate_bytes(bytes_ABC)
100
    2
101
    >>> for_char_in_enumerate_bytes(bytes_abc_null)
102
    'X'
103
    >>> for_char_in_enumerate_bytes(bytes_ABC_null)
104
    4
105
    """
106
    cdef char c
107
    cdef Py_ssize_t i
108
    for i, c in enumerate(s):
109
        if c == b'C':
110
            return i
111
    else:
112
        return 'X'
113

114
#### Py2 and Py3 behave differently here: Py2->bytes, Py3->integer
115
##
116
## @cython.test_assert_path_exists("//ForFromStatNode")
117
## @cython.test_fail_if_path_exists("//ForInStatNode")
118
## def for_pyvar_in_char_ptr(char* c_string):
119
##     """
120
##     >>> for_pyvar_in_char_ptr( (bytes_abc+bytes_ABC) * 2 )
121
##     [True, True, True, False, False, False, True, True, True, False]
122
##     >>> for_pyvar_in_char_ptr( bytes_abc_null * 2 )
123
##     [True, False, True, False, True, True, False, True, False, True]
124
##     """
125
##     in_test = []
126
##     cdef object c
127
##     for c in c_string[:10]:
128
##         in_test.append( c in b'abc' )
129
##     return in_test
130

131
@cython.test_assert_path_exists("//ForFromStatNode")
132
@cython.test_fail_if_path_exists("//ForInStatNode")
133
def for_char_in_char_ptr(char* c_string):
134
    """
135
    >>> for_char_in_char_ptr( (bytes_abc+bytes_ABC) * 2 )
136
    [True, True, True, False, False, False, True, True, True, False]
137
    >>> for_char_in_char_ptr( bytes_abc_null * 2 )
138
    [True, False, True, False, True, True, False, True, False, True]
139
    """
140
    in_test = []
141
    cdef char c
142
    for c in c_string[:10]:
143
        in_test.append( c in b'abc' )
144
    return in_test
145

146
@cython.test_assert_path_exists("//ForFromStatNode")
147
@cython.test_fail_if_path_exists("//ForInStatNode")
148
def for_pyunicode_in_unicode(unicode s):
149
    """
150
    >>> for_pyunicode_in_unicode(unicode_abc)
151
    'X'
152
    >>> for_pyunicode_in_unicode(unicode_ABC)
153
    'C'
154
    >>> for_pyunicode_in_unicode(unicode_abc_null)
155
    'X'
156
    >>> for_pyunicode_in_unicode(unicode_ABC_null)
157
    'C'
158
    """
159
    cdef Py_UNICODE c
160
    for c in s:
161
        if c == u'C':
162
            return 'C'
163
    else:
164
        return 'X'
165

166
@cython.test_assert_path_exists("//ForFromStatNode")
167
@cython.test_fail_if_path_exists("//ForInStatNode")
168
def for_pyunicode_in_enumerate_unicode(unicode s):
169
    """
170
    >>> for_pyunicode_in_enumerate_unicode(unicode_abc)
171
    'X'
172
    >>> for_pyunicode_in_enumerate_unicode(unicode_ABC)
173
    2
174
    >>> for_pyunicode_in_enumerate_unicode(unicode_abc_null)
175
    'X'
176
    >>> for_pyunicode_in_enumerate_unicode(unicode_ABC_null)
177
    4
178
    """
179
    cdef Py_UNICODE c
180
    cdef Py_ssize_t i
181
    for i, c in enumerate(s):
182
        if c == u'C':
183
            return i
184
    else:
185
        return 'X'
186

187
@cython.test_assert_path_exists("//ForFromStatNode")
188
@cython.test_fail_if_path_exists("//ForInStatNode")
189
def for_pyucs4_in_unicode(unicode s):
190
    """
191
    >>> for_pyucs4_in_unicode(unicode_abc)
192
    'X'
193
    >>> for_pyucs4_in_unicode(unicode_ABC)
194
    'C'
195
    >>> for_pyucs4_in_unicode(unicode_abc_null)
196
    'X'
197
    >>> for_pyucs4_in_unicode(unicode_ABC_null)
198
    'C'
199
    """
200
    cdef Py_UCS4 c
201
    for c in s:
202
        if c == u'C':
203
            return 'C'
204
    else:
205
        return 'X'
206

207
@cython.test_assert_path_exists("//ForFromStatNode")
208
@cython.test_fail_if_path_exists("//ForInStatNode")
209
def for_pyucs4_in_enumerate_unicode(unicode s):
210
    """
211
    >>> for_pyucs4_in_enumerate_unicode(unicode_abc)
212
    'X'
213
    >>> for_pyucs4_in_enumerate_unicode(unicode_ABC)
214
    2
215
    >>> for_pyucs4_in_enumerate_unicode(unicode_abc_null)
216
    'X'
217
    >>> for_pyucs4_in_enumerate_unicode(unicode_ABC_null)
218
    4
219
    """
220
    cdef Py_UCS4 c
221
    cdef Py_ssize_t i
222
    for i, c in enumerate(s):
223
        if c == u'C':
224
            return i
225
    else:
226
        return 'X'
227

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.