Этот ответ , связанный @CodeSurgeon, является возможностью сделать это.Тем не менее, начиная с Cython 0.28 у нас гораздо более понятный способ - типизированные только для чтения просмотров памяти:
%%cython
mv = memoryview(b'1234')
cdef const unsigned char[:] tmv=mv #"const" is possible since Cython 0.28
Очевидно, что вы можете читать только из этого обзора памяти (это хорошо) икопирование не требуется.
Вы также можете сказать: но это unsigned char
, а не char
!Правда - это тоже хорошо: bytes
- это unsigned char
s, и весь смысл типизированных представлений памяти в том, что вы не путаете типы!
Еще одна причина, по которой я думаю, что связанное решение - это своего родаопасно - у вас есть вся сила C, чтобы выстрелить себе в ногу, потому что он отбрасывает типы и константность.См. Например:
%%cython
def bad_things(a):
cdef const unsigned char[:] safe=a
cdef char *unsafe=<char *> &safe[0] #who needs const and types anyway?
unsafe[0]=52 #replace through `4`
А теперь:
>>> A=b'a'
>>> bad_things(A)
>>> print(A) #take it Python - I pwned your immutability!
b'4'
>>> print(b'a')
b'4'
>>> #Help! What are you doing Python?
Поскольку в Python есть пул небольших строк, которые являются неизменяемыми (или так думает Python), и мы изменилиобъект, с которым b'a'
связан с b'4'
, мы должны подготовиться к забавным результатам и счастливой отладке ...
В целом, это не составляет труда: придерживаться типизированных представлений памяти, которые гарантируют тип иконстантность-безопасности.