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

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

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

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

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

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

Ваше здоровье,

Пит


person Community    schedule 11.05.2010    source источник
comment
Доступны модули битового поля, такие как битовая строка, битовый массив и битовый вектор (проверьте на PyPi). Может быть, стоит проверить их, если вы не хотите изобретать велосипед.   -  person Scott Griffiths    schedule 11.05.2010
comment
Я знаю, что изобретаю велосипед здесь, но я делаю этот проект для удовольствия, и как-то неудовлетворительно использовать код, написанный кем-то другим в этом контексте (глупо, я знаю!).   -  person    schedule 12.05.2010


Ответы (3)


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

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

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

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

person Scott Griffiths    schedule 11.05.2010
comment
Согласованный. Я думаю, что, как правило, eval(repr(x)) должен как можно лучше воссоздать x. не уверен насчет str, но мне нравится это решение. - person Claudiu; 11.05.2010

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

person sblom    schedule 11.05.2010

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

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

person eemz    schedule 11.05.2010