2010-05-11 3 views
10

В моем текущем проекте требуется широкое использование битовых полей. Я нашел простой, функциональный recipe for bit a field class, но мне не хватало нескольких функций, поэтому я решил продлить его. Я только что добрался до внедрения __str__ и __repr__, и я хочу убедиться, что я следую конвенции.Правильное использование Python __str__ и __repr__

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

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

по вашему мнению будет эта реализация соответствуют конвенции для str и repr?

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

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

Пит

+2

Доступны битовые полевые модули, такие как bitstring, bitarray и bitvector (проверка на PyPi). Возможно, стоит проверить их, если вы не хотите изобретать велосипед. –

+0

Я знаю, что я изобретаю колесо здесь, но я делаю этот проект для удовольствия, и это как-то не нравится использовать код, который кто-то написал в этом контексте (глупый, я знаю!). – Peter

ответ

12

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

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

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

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

+4

Согласовано.Я думаю, что, как правило, eval (repr (x)) должен воссоздать x как можно лучше. не уверен в str, но мне нравится это решение. – Claudiu

1

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

0

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

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

Смежные вопросы