Как я уже упоминал в комментариях к ответу @ wim, я думаю, что вы можете использовать инкрементальный декодер codecs.iterdecode()
для этого. Поскольку это генераторная функция, нет необходимости вручную сохранять и восстанавливать ее состояние между итеративными вызовами.
Вот как это можно использовать для обработки ситуации, подобной той, которую вы описали:
import codecs
from random import randint
def reader(sequence):
""" Yield random length chunks of sequence until exhausted. """
plural = lambda word, n, ending='s': (word+ending) if n > 1 else word
i = 0
while i < len(sequence):
size = randint(1, 4)
chunk = sequence[i: i+size]
hexrepr = '0x' + ''.join('%02X' % b for b in chunk)
print('read {} {}: {}'.format(size, plural('byte', len(chunk)), hexrepr))
yield chunk
i += size
bytes_obj = b'\xc3\x84\xc3\x96\xc3\x9c\xc3\x84\xc3\x96\xc3\x9c' # 'ÄÖÜÄÖÜ'
for decoded in codecs.iterdecode(reader(bytes_obj), 'utf-8'):
print(decoded)
Пример вывода:
read 3 bytes: 0xC384C3
Ä
read 1 byte: 0x96
Ö
read 1 byte: 0xC3
read 3 bytes: 0x9CC384
ÜÄ
read 2 bytes: 0xC396
Ö
read 4 bytes: 0xC39C
Ü
Определенно походит на хорошую идею мне. То, что Вы делаете, подобно шаблону Единицы работы, предназначенному для отслеживания изменения, которые Вы внесли в отображенные объекты и фиксацию (обычно как единственная транзакция), после того как Вы сделаны.
Я полагаю, что проекты как Выход и Отдых предоставляют это Вам в PHP, а также облегчающий часть отображающейся боли, но я лично не использовал их.
Как в стороне, это кажется, что Ваши иерархии объектов могут извлечь выгоду из того, чтобы быть просматриваемым, как Агрегируется, если Вы хотите спуститься по Доменному Управляемому пути Дизайна и преимуществу от чистой изоляции, это приносит.
--
Править: также похоже, что eZ Компоненты имеют довольно полнофункциональное решение PHP ORM, и Доктрина 2.0 развивается это слишком.
--
Редактирование 2: Я не посмотрел бы на, Продвигают или креольский язык для проблемы, которую Вы обсуждаете. Креольский язык не является ORM, но больше уровня абстракции DB, сродни PDO - и проект, теперь официально "Мертво". Продвиньте использует шаблон ActiveRecord, не шаблон DataMapper, таким образом, Ваши объекты области заканчиваются с намного большей ответственностью за персистентность и AFAIK, это не включает средство Единицы работы.
Если Вы изучаете выезд ORM, Продвигают и креольский язык.