Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 7, 2017 20:31:29

ViktorR
Зарегистрирован: 2017-06-25
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Записи с вариантной частью

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

Как-то так, …
PS: Исключительно в учебных целях.

Офлайн

#2 Ноя. 7, 2017 22:32:04

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Записи с вариантной частью

 from ctypes import *
class POINT(Union):
    _fields_ = [("x", c_int),("y", c_float)]
pnt=POINT()
pnt.y=5.55
print(pnt.x)
>>> 1085381018



Офлайн

#3 Ноя. 7, 2017 23:54:50

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Записи с вариантной частью

doza_and
прочитал вопрос автора, посмотрел на Ваш ответ, и хотелось бы пояснений, а то что то не понял что Вы этим хотели показать.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#4 Ноя. 8, 2017 01:15:38

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Записи с вариантной частью

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'>
>>> 

Офлайн

#5 Ноя. 8, 2017 05:04:31

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Записи с вариантной частью

Похоже вам нужен модуль struct



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#6 Ноя. 8, 2017 06:56:17

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Записи с вариантной частью

JOHN_16
и хотелось бы пояснений, а то что то не понял что Вы этим хотели показать.
Автор для образования хочет узнать как обращаться к одной области памяти интерпретируя ее или как float или как bytes. Такое обычно бывает при получении данных из внешних источников когда протокол содержит признаки как интерпретировать данные пакета. Иногда так делают чтобы экономить память.
В с и фортране для этого используется union. Вот я и показал ТС как создать union А заодно и модуль ctypes который позволяет создать практически любые структуры данных.



Офлайн

#7 Ноя. 8, 2017 14:46:41

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Записи с вариантной частью

doza_and
тогда я не увидел этого в Вашем примере - должно было бы например переменная x которую мы можете 1) прочитать как float и как bytes 2) изменить как float и увидеть как оно поменялось как bytes
P.S. я то понимаю о чем речь, но вот в Вашем примере я не увидел подобного.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#8 Ноя. 8, 2017 19:24:30

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Записи с вариантной частью

Методически правильнее было показать принтом что по умолчанию память обнулена. А дальше как у вас и написано, поменяли float поменялся int. Но похоже ТС наплевать, так что пока можно не заморачиваться. Кроме того он человек грамотный на 3 языках знает как это делать, я вообще хотел написать что ctypes union позволяет это сделать и все.



Отредактировано doza_and (Ноя. 8, 2017 19:50:24)

Офлайн

#9 Ноя. 8, 2017 19:43:49

ViktorR
Зарегистрирован: 2017-06-25
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Записи с вариантной частью

Спасибо за ответы.
Vic57
Ваш пример - как создать запись. При этом поля являются самостоятельными единицами.
Если изменить значение одного из полей, то значение второго поля не изменится.

doza_and
Это то, что мне надо, как я понял.
Вопрос:

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

Как-то так, …

Отредактировано ViktorR (Ноя. 8, 2017 19:44:34)

Офлайн

#10 Ноя. 8, 2017 19:55:03

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Записи с вариантной частью

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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version