Форум сайта python.su
Подскажите, пожалуйста.
Можно ли в Python выполнить “наложение” типов.
Например, переменная типа float и вторая переменная типа bytearray размещаются по одному и тому же адресу. В Си, Паскаль, Фортран - это записи с вариантной частью.
Меняем значение через float, а читаем байтовый массив или наоборот.
Если да, дайте ссылку.
Как-то так, …
PS: Исключительно в учебных целях.
Офлайн
from ctypes import * class POINT(Union): _fields_ = [("x", c_int),("y", c_float)] pnt=POINT() pnt.y=5.55 print(pnt.x) >>> 1085381018
Офлайн
doza_and
прочитал вопрос автора, посмотрел на Ваш ответ, и хотелось бы пояснений, а то что то не понял что Вы этим хотели показать.
Офлайн
ViktorRможно
Можно ли в Python выполнить “наложение” типов.
>>> class A(): x=10 y='qwe' >>> a = A() >>> type(a.x) <class 'int'> >>> type(a.y) <class 'str'> >>> a.x=b'qwe' >>> type(a.x) <class 'bytes'> >>>
Офлайн
Похоже вам нужен модуль struct
Офлайн
JOHN_16Автор для образования хочет узнать как обращаться к одной области памяти интерпретируя ее или как float или как bytes. Такое обычно бывает при получении данных из внешних источников когда протокол содержит признаки как интерпретировать данные пакета. Иногда так делают чтобы экономить память.
и хотелось бы пояснений, а то что то не понял что Вы этим хотели показать.
Офлайн
doza_and
тогда я не увидел этого в Вашем примере - должно было бы например переменная x которую мы можете 1) прочитать как float и как bytes 2) изменить как float и увидеть как оно поменялось как bytes
P.S. я то понимаю о чем речь, но вот в Вашем примере я не увидел подобного.
Офлайн
Методически правильнее было показать принтом что по умолчанию память обнулена. А дальше как у вас и написано, поменяли float поменялся int. Но похоже ТС наплевать, так что пока можно не заморачиваться. Кроме того он человек грамотный на 3 языках знает как это делать, я вообще хотел написать что ctypes union позволяет это сделать и все.
Отредактировано doza_and (Ноя. 8, 2017 19:50:24)
Офлайн
Спасибо за ответы.
Vic57
Ваш пример - как создать запись. При этом поля являются самостоятельными единицами.
Если изменить значение одного из полей, то значение второго поля не изменится.
doza_and
Это то, что мне надо, как я понял.
Вопрос:
_fields_ = [("x", <???>),("y", c_double)]
Отредактировано ViktorR (Ноя. 8, 2017 19:44:34)
Офлайн
doza_andнаверное был не прав.
Но похоже ТС наплевать,
ViktorR
Как создать поле из массива байт,
from ctypes import * class POINT(Union): _fields_ = [("x", c_char*8),("y", c_double)] pnt=POINT() pnt.y=5.55 print(pnt.x) >>> b'333333\x16@'
Отредактировано doza_and (Ноя. 8, 2017 19:55:57)
Офлайн