Мой текущий проект требует широкого применения битовых полей. Я нашел простой, функциональный рецепт для бита полевым классом, но он испытывал недостаток в нескольких функциях, в которых я нуждался, таким образом, я решил расширить его. Я только что добрался до реализации __str__
и __repr__
и я хочу удостовериться, что я следую конвенции.
__str__
как предполагается, является неофициальным и кратким, таким образом, я заставил его возвратить десятичное значение битового поля (т.е. str(bit field 11)
был бы "3"
.
__repr__
как предполагается, официальное представление объекта, таким образом, я заставил его возвратить фактическую строку битов (т.е. repr(bit field 11)
был бы "11"
).
По Вашему мнению был бы эта реализация выполнять конвенции для str
и repr
?
Кроме того, я использовал bin()
функция для получения строки битов значения, сохраненного в классе. Это не совместимо с Python <2.6, есть ли альтернативный метод?
Удачи,
Pete
__ repr __
предпочтительно должна быть строкой, которую можно использовать для воссоздания объекта, например, если вы используете для него eval
- см. документы здесь . Это не точная наука, так как это может зависеть, например, от того, как пользователь вашего модуля импортировал его.
Я бы хотел, чтобы __ str __
возвращал двоичную строку, а __ repr __
возвращал Classname (binary_string)
или что-то еще, что можно было бы использовать для воссоздания объекта.
В модуле битовой строки (который я поддерживаю) __ str __
является шестнадцатеричным, если битовая строка кратна 4 битам, в противном случае она либо двоичная, либо их комбинация. Также, если строка битов очень длинная, она обрезается (вы не хотите пытаться распечатать строку битов 100 МБ в интерактивном сеансе!)
Я бы не использовал функцию bin ()
вообще, если бы я был на вашем месте.Причина в том, что его нельзя использовать, если ваша битовая строка начинается с нуля (см. Мой вопрос здесь ). Я бы посоветовал использовать вместо этого метод или свойство bin
.
Я бы подумал о том, чтобы __str__
возвращала шестнадцатеричное представление. Таким образом, будет легче определить фактические значения битов, и, следовательно, это будет более полезно. Но все еще довольно лаконично (фактически, меньше символов, чем в десятичном представлении).
__ repr __
необходимо вернуть что-то, что при передаче в ваш конструктор создаст новый объект, который является идентичной копией исходного.
Ваш возвращает «11», но если вы передали конструктору «11», то в результате вы бы не получили то же битовое поле. Итак, этот __ repr __
не подходит.