Вопрос

В Python 2.6 (и более ранних версиях) встроенные функции hex () и oct () могут быть перегружены в классе путем определения __ hex __ и __ oct __ . Однако специальной функции __ bin __ для перегрузки поведения встроенной функции Python 2.6 bin () нет.

Я хочу знать, существует ли какой-либо способ гибкой перегрузки bin () , и если нет, то мне было интересно, почему несовместимый интерфейс?

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

>>> a = BitString(length=12)       # Twelve zero bits
>>> hex(a)
'0x000'
>>> oct(a)
'0o0000'
>>> bin(a)
'0b0' <------ I want it to output '0b000000000000'

Я подозреваю, что нет способа достичь этого, но я подумал, что не мешало бы спросить!

Это было полезно?

Решение 2

Я думаю, что короткий ответ: «Нет, bin () не может быть перегружен, как oct () и hex () .

Что касается того, почему ответ должен лежать в Python 3.0, который использует __ index __ для перегрузки hex () , oct () и < code> bin () и полностью удалили специальные функции __ oct __ и __ hex __ .

Таким образом, Python 2.6 bin () выглядит очень похоже на то, что это действительно функция Python 3.0, которая была перенесена обратно без особого учета того, что она делает вещи новым способом Python 3, а не старым Python 2 пути. Я также предположил бы, что это вряд ли будет исправлено, даже если это считается ошибкой.

Другие советы

Как вы уже обнаружили, вы не можете переопределить bin () , но это не похоже на то, что вам нужно это делать. Вы просто хотите двоичное значение с 0 дополнением. К сожалению, в Python 2.5 и более ранних версиях вы не могли использовать "% b " чтобы указать двоичный файл, поэтому вы не можете использовать "% " Оператор форматирования строки для достижения желаемого результата.

К счастью, Python 2.6 предлагает то, что вы хотите, в виде новой str .format () . Я считаю, что именно этот бит шума линий - это то, что вы ищете:

>>> '{0:010b}'.format(19)
'0000010011'

Синтаксис этого мини-языка находится в формате format мини-язык спецификации " в документах. Чтобы сэкономить время, я объясню строку, которую я использую:

<Ол>
  • нулевой параметр (т.е. 19 ) должен быть отформатирован с использованием
  • волшебный " 0 " чтобы указать, что я хочу 0 с добавлением, выровненный по правому краю номер, с
  • 10 цифр точности в
  • двоичный формат.
  • Вы можете использовать этот синтаксис для создания различных творческих версий выравнивания и отступов.

    Функция bin получает свое значение от функции __ index __ объекта. Таким образом, для объекта вы можете определить значение, преобразованное в двоичное, но вы не можете определить формат строки.

    Вы можете добиться того же поведения, что и для hex и oct, переопределив / заменив встроенную функцию bin () своей собственной реализацией, которая пыталась вызвать bin для передаваемого объекта и отступила к стандартная функция bin (), если объект не предоставляет bin . Однако, исходя из того, что явное лучше, чем неявное, кодирование приложения в зависимости от пользовательской версии bin (), вероятно, не очень хорошая идея, поэтому, возможно, просто дайте функции другое имя, например.

    def mybin(n):
        try:
            return n.__bin__()
        except AttributeError:
            return bin(n)
    

    Что касается несоответствия в интерфейсе, я не уверен. Может быть, это потому, что bin () был добавлен совсем недавно, поэтому это небольшой недосмотр?

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top