Как определить C-подобную структуру в Python больше pythonic? [Дубликат]

DecimalFormat - лучший способ вывода, но я не предпочитаю его. Я всегда делаю это все время, потому что он возвращает двойное значение. Поэтому я могу использовать его больше, чем просто вывод.

Math.round(selfEvaluate*100000d.0)/100000d.0;

ИЛИ

Math.round(selfEvaluate*100000d.0)*0.00000d1;

Если вам нужно большое значение десятичных знаков, вы можете использовать BigDecimal. В любом случае .0 важно. Без него округление 0,333333d5 возвращает 0,33333 и допускается только 9 цифр. Вторая функция без .0 имеет проблемы с возвратом 0.30000 0.30000000000000004.

36
задан Mr Temp 1 December 2009 в 12:57
поделиться

3 ответа

У PythonInfo wiki есть решение для этого.

FAQ: Как скопировать байты в Python из ctypes.Structure?

def send(self):
    return buffer(self)[:]

Часто задаваемые вопросы: Как скопировать байты в ctypes.Structure из Python?

def receiveSome(self, bytes):
    fit = min(len(bytes), ctypes.sizeof(self))
    ctypes.memmove(ctypes.addressof(self), bytes, fit)

Их send является (более или менее) эквивалентом pack, а receiveSome - это тип pack_into. Если у вас есть «безопасная» ситуация, когда вы распаковываете в структуру того же типа, что и оригинал, вы можете сделать однострочное, как memmove(addressof(y), buffer(x)[:], sizeof(y)), скопировать x в y. Конечно, у вас, вероятно, будет переменная как второй аргумент, а не буквальная упаковка x.

27
ответ дан Mark Rushakoff 22 August 2018 в 07:42
поделиться
  • 1
    Я тестировал это решение, и оно работает. Что для меня было более важно, так это то, что вы нашли официальный объект python.org (часто задаваемые вопросы в вики) утверждают, что взлом - это путь. Мне просто казалось, что эти 2 функции / методы должны быть где-то в ctypes.py, так что взломать его с помощью указателей показалось очень неряшливым. Я знаю, что некоторые люди говорят, что ctypes не построено для сериализации и т. Д., Но мне нравится ctypes OOP-ness намного больше, чем модуль perl-ish struct. – Mr Temp 1 December 2009 в 19:06
  • 2
    Что относительно Python3, у которого нет buffer? Если вы попытаетесь просто заменить его на memoryview, вы получите TypeError: invalid indexing of 0-dim memory – Jonathon Reinhart 28 February 2017 в 16:39
  • 3
    В Python3 вы можете использовать bytes(self) для извлечения структурных байтов. – Zanapher 12 May 2017 в 14:19

Проверено на Python3

e = Example(12, 13)
serialized = bytes(e)
deserialized = Example.from_buffer_copy(serialized)
1
ответ дан TomDotTom 22 August 2018 в 07:42
поделиться

Посмотрите эту ссылку на двоичный код ввода / вывода в python:

http://www.dabeaz.com/blog/2009/08/python-binary-io-handling .html

Исходя из этого, вы можете просто написать следующее для чтения из буфера (а не только файлов):

g = open("foo","rb")
q = Example()
g.readinto(q)

Для записи просто:

g.write(q)

То же самое для использования сокетов:

s.send(q)

и

s.recv_info(q)

Я провел некоторое тестирование с помощью pack / unpack и ctypes, и этот подход быстрее всего, за исключением прямой записи в C

16
ответ дан user545424 22 August 2018 в 07:42
поделиться
  • 1
    В версии 2.6+ более общий pack - это просто bytearray(q), который также использует буферный протокол. Для общей распаковки 2.6 также добавлен, например, Example.from_buffer(buf), если buf изменен, иначе Example.from_buffer_copy(buf). – eryksun 16 July 2013 в 15:24
Другие вопросы по тегам:

Похожие вопросы: