Я работаю над пакетом Python, который должен поддерживать PY3 и Iron Python :(. До сих пор поддержка IPY была исправлена в качестве доказательства концепции. Применение байт-массивов, где 'bytes' vs 'str' будет Для решения большинства наших проблем было достаточно, и большая часть кода была написана с учетом других тем о совместимости. Теперь мы хотим разобраться с этим более чисто и смотрим на такие вещи, как pasteurize , six , et c.
Мой коллега раздвоил пастеризацию и более подробно рассматривает вопрос о добавлении дополнительных фиксаторов, адаптированных к некоторым из наших потребностей. В настоящее время это автоматизирует многие вещи, но Существует одна общая проблема, и я хотел бы знать, есть ли рекомендуемый подход для ее обработки.
Возьмите следующий код:
from __future__ import print_function
from __future__ import unicode_literals
from builtins import bytes, str
import struct
print(type(struct.pack('>H', 0x31)))
# ipy: <type 'str'>
# py3: <class 'bytes'>
print(isinstance(struct.pack('>H', 0x31), str))
# ipy: True
# py3: False
#print(bytes(struct.pack('>B', 0x31), 'utf-8'))
# ipy: b'1'
# py3: error on py 3 - pack returns bytes not str
Мы хотим, чтобы все наши данные низкого уровня быть байтами (<class 'future.types.newbytes.newbytes'>
на МПГ), но поскольку мы не можем (и не хотим) применять фьючерсы на стандартные библиотеки, такие как struct.pack
, какой подход рекомендуется для решения сценария ios как это чисто, т.е. Используемая библиотека возвращает 'str' для PY2 и байты для PY3, поскольку байты ожидаются в других областях кода, которые вы хотите убедиться в этом. Как мы можем предотвратить проникновение 'str' объектов? Может ли это быть автоматизировано с помощью чего-то, что уже существует? Это просто то, что нужно решить в рамках дизайна API? В идеале, люди, работающие над кодом, должны иметь Python 3 опыта и некоторые общие знания по темам, чтобы следить за поддержкой МПГ - насколько это возможно, они будут автоматизированы членами команды, которые больше знают о подводных камнях.