Правильное использование Python __str__ и __repr__ - PullRequest
10 голосов
/ 11 мая 2010

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

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

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

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

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

Приветствия

Пит

Ответы [ 3 ]

12 голосов
/ 11 мая 2010

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

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

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

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

1 голос
/ 11 мая 2010

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

0 голосов
/ 11 мая 2010

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

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

...