Найти - Пользователи
Полная версия: Записи с вариантной частью
Начало » Python для новичков » Записи с вариантной частью
1 2
ViktorR
Подскажите, пожалуйста.
Можно ли в Python выполнить “наложение” типов.
Например, переменная типа float и вторая переменная типа bytearray размещаются по одному и тому же адресу. В Си, Паскаль, Фортран - это записи с вариантной частью.
Меняем значение через float, а читаем байтовый массив или наоборот.
Если да, дайте ссылку.

Как-то так, …
PS: Исключительно в учебных целях.
doza_and
 from ctypes import *
class POINT(Union):
    _fields_ = [("x", c_int),("y", c_float)]
pnt=POINT()
pnt.y=5.55
print(pnt.x)
>>> 1085381018
JOHN_16
doza_and
прочитал вопрос автора, посмотрел на Ваш ответ, и хотелось бы пояснений, а то что то не понял что Вы этим хотели показать.
vic57
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'>
>>> 
PooH
Похоже вам нужен модуль struct
doza_and
JOHN_16
и хотелось бы пояснений, а то что то не понял что Вы этим хотели показать.
Автор для образования хочет узнать как обращаться к одной области памяти интерпретируя ее или как float или как bytes. Такое обычно бывает при получении данных из внешних источников когда протокол содержит признаки как интерпретировать данные пакета. Иногда так делают чтобы экономить память.
В с и фортране для этого используется union. Вот я и показал ТС как создать union А заодно и модуль ctypes который позволяет создать практически любые структуры данных.
JOHN_16
doza_and
тогда я не увидел этого в Вашем примере - должно было бы например переменная x которую мы можете 1) прочитать как float и как bytes 2) изменить как float и увидеть как оно поменялось как bytes
P.S. я то понимаю о чем речь, но вот в Вашем примере я не увидел подобного.
doza_and
Методически правильнее было показать принтом что по умолчанию память обнулена. А дальше как у вас и написано, поменяли float поменялся int. Но похоже ТС наплевать, так что пока можно не заморачиваться. Кроме того он человек грамотный на 3 языках знает как это делать, я вообще хотел написать что ctypes union позволяет это сделать и все.
ViktorR
Спасибо за ответы.
Vic57
Ваш пример - как создать запись. При этом поля являются самостоятельными единицами.
Если изменить значение одного из полей, то значение второго поля не изменится.

doza_and
Это то, что мне надо, как я понял.
Вопрос:
 _fields_ = [("x", <???>),("y", c_double)]
Тип c_double, как я понимаю, занимает 8-мь байт.
<???> - это один из типов, который я должен указать.
Если тут вписать c_ubyte, то будет создано поле в один байт.
Как создать поле из массива байт, с тем, что бы затем можно было написать, например, print(x) и просмотреть содержимое всех байтов?

Как-то так, …
doza_and
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@'
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB