В этом уроке по основам Python, мы рассмотрим функцию memoryview()
. Функция memoryview()
позволяет коду Python получать доступ к внутренним буферам объекта путем создания объекта представления памяти.
Что такое буферный протокол?
Это протокол на Python, который позволяет напрямую взаимодействовать со структурой данных и извлекать ее данные. Это означает, что буферный протокол обеспечивает способ доступа к внутренним данным объекта.
Обычно мы можем получить доступ к строковым данным или целочисленным данным, но что, если мы пройдем через какой-то огромный кусок необычных данных? Здесь этот протокол позволяет объекту обмениваться своими данными.
Этот протокол реализован на уровне C. Он доступен нам только на уровне C-API. Работа с буфером происходит быстрее, чем работа с объектом на высоком уровне Python.
Буферный протокол позволяет нам получать доступ к данным в объекте данных memoryview на уровне Python без какого-либо программирования на языке C. Это означает, что объект, на котором мы собираемся использовать memoryview, должен поддерживать буферный протокол.
Синтаксис:
memoryview(object)
Аргументы:
- Аргументом может быть объект в байтовом значении.
Примеры:
test_str = b'Hello, world!'
print(memoryview(test_str))
print(type(test_str))
Результат:
>>> <memory at 0x0000016EA3D1D9C0>
>>> <class 'bytes'>
Если же мы передадим не байтовое значение, то получим ошибку: TypeError: memoryview: a bytes-like object is required, not 'str'
Мы видим, что объект memoryview
печатает память по какому-то адресу.
И что мы можем с этим делать? Теперь у нас есть доступ к хранящимся в них значениям. Давайте посмотрим, что все мы можем сделать с этим, с помощью определенных методов memoryview
:
test_str = b'Hello, world!'
mem_test_str = memoryview(test_str)
print(mem_test_str.obj)
print(mem_test_str.tolist())
Результат:
>>> b'Hello, world!'
>>> [72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33]
Пояснение:
- Метод
obj
- печатает исходное значение. - Метод
tolist()
- выводит значение ASCII каждой буквы
Ещё один пример, с изменением значений:
test_str = bytearray('Hello, Vladislav!', 'UTF-8')
test_str_mem = memoryview(test_str)
test_str_mem[0] = 90 # ASCII for letter Z
print(test_str_mem.tobytes())
print(test_str)
Результат:
>>> b'Zello, Vladislav!'
>>> bytearray(b'Zello, Vladislav!')