Надлежащее использование Python __ ул. __ и __ repr __

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

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

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

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

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

Удачи,

Pete

10
задан Will McCutchen 11 May 2010 в 17:08
поделиться

3 ответа

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

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

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

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

12
ответ дан 3 December 2019 в 23:48
поделиться

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

1
ответ дан 3 December 2019 в 23:48
поделиться

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

Ваш возвращает «11», но если вы передали конструктору «11», то в результате вы бы не получили то же битовое поле. Итак, этот __ repr __ не подходит.

0
ответ дан 3 December 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: