проблема str.format () - PullRequest
       1

проблема str.format ()

3 голосов
/ 24 декабря 2009

Итак, я создал этот класс, который выводит '{0}', когда x = 0 или '{1}' для каждого другого значения x.

class offset(str):  
    def __init__(self,x):  
        self.x=x  
    def__repr__(self):
        return repr(str({int(bool(self.x))}))
    def end(self,end_of_loop):
    #ignore this def it works fine
        if self.x==end_of_loop:
            return '{2}'
        else:
            return self

Я хочу сделать это:
offset(1).format('first', 'next')
но он вернет только число, которое я даю для x в виде строки. Что я делаю не так?

1 Ответ

4 голосов
/ 24 декабря 2009

Ваш подкласс str не переопределяет format, поэтому, когда вы вызываете format в одном из его экземпляров, он просто использует тот, унаследованный от str, который использует внутреннее значение self как str ", т. Е. Строковая форма того, что вы передали offset().

Чтобы изменить это внутреннее значение, вы можете переопределить __new__, например ::

class offset(str):
    def __init__(self, x):
        self.x = x
    def __new__(cls, x):
        return str.__new__(cls, '{' + str(int(bool(x))) + '}')

for i in (0, 1):
  x = offset(i)
  print x
  print repr(x)
  print x.format('first', 'next')

излучает

{0}
'{0}'
first
{1}
'{1}'
next

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...