Правильное использование Python __str__ и __repr__

Мой текущий проект требует широкого использования битовых полей. Я нашел простой, функциональный recipe для бит класс поля, но в нем не хватало нескольких функций, которые мне нужны, поэтому Я решил продлить его. Я только что получил реализацию __str__ и __repr__, и я хочу убедиться, что я следую конвенции.

__str__ должен быть неформальным и кратким, поэтому я вернул десятичное значение битового поля (т.е. str(bit field 11) будет "3".

__repr__ должен быть официальным представлением объекта, поэтому я вернул ему фактическую строку бит (т.е. repr(bit field 11) будет "11").

По вашему мнению, эта реализация соответствует соглашениям для str и repr?

Кроме того, я использовал функцию bin() для получения битовой строки значения, хранящегося в классе. Это несовместимо с Python < 2.6, есть ли альтернативный метод?

Приветствия,

Пит

Ответ 1

__repr__ должен предпочтительно быть строкой, которая может быть использована для воссоздания объекта, например, если вы используете eval на нем - см. docs . Это не точная наука, поскольку она может зависеть от того, как пользователь импортировал ее, например.

Я бы вернул двоичную строку __str__, а __repr__ return Classname(binary_string) или что-то еще, что можно было бы использовать для воссоздания объекта.

В bitstring модуль (который я поддерживаю), __str__ является шестнадцатеричным, если битстрона кратна 4 битам, иначе он либо двоичный, либо комбинация из двух. Также, если битстрона очень длинная, тогда она усекается (вы не хотите пытаться печатать битовую строку 100 МБ в интерактивном сеансе!)

Я бы вообще не использовал функцию bin(), если бы я был вами. Причина в том, что его нельзя использовать, если ваша битовая строка начинается с нулевых бит (см. Мой вопрос здесь). Я бы посоветовал использовать вместо этого метод или свойство bin.

Ответ 2

Я бы подумал, что вместо __str__ вернуть шестнадцатеричное представление. Таким образом, легче понять, что такое фактические значения бит, и, следовательно, более полезно. Но все же довольно кратким (на самом деле, меньше символов, чем десятичное представление).

Ответ 3

__repr__ нужно вернуть что-то, что, если передать его конструктору, создаст новый объект, который является идентичной копией исходного.

Ваш возвращает "11", но если вы передали "11" вашему конструктору, вы не получили бы такое же битполе в результате. Таким образом, это __repr__ не работает.