Создание пользовательского спецификатора формата в методе __format__ в python - PullRequest
0 голосов
/ 29 апреля 2018

Я реализовывал свои собственные спецификаторы формата, переопределяя метод __format__() в моем классе. Теперь проблема в том, что я получаю ошибку ниже. Это потому, что я не могу использовать %s для любой другой спецификации формата, кроме str(), или я здесь что-то не так делаю.

Traceback (последний вызов был последним): Файл «test.py», строка 66, в print («У дилера {0:% r% s}». формат (NumberCard (1, Club))) Файл "ch1.py", строка 24, в формате result = format_spec.replace ("% r", self.rank) .replace ("% s", self.suit) TypeError: аргумент replace () 2 должен быть str, а не int

class Card:

    insure = False

    def __init__(self, rank, suit):
        self.suit = suit
        self.rank = rank
        self.hard, self.soft = self._points()

    def __str__(self):
        return "{rank}{suit}".format(**self.__dict__)

    def __repr__(self):
        return "{__class__.__name__}(suit={suit!r}, rank={rank!r})".format(__class__=self.__class__, **self.__dict__)

    def __format__(self, format_spec):
        if format_spec == "":
            return str(self)
        else:
            result = format_spec.replace("%r", self.rank).replace("%s", self.suit)
            result = result.replace("%%", "%")
            return result

class NumberCard(Card):

    def _points(self):
        return int(self.rank), int(self.rank)


class Suit:

    def __init__(self, name, symbol):
        self.name = name
        self.symbol = symbol

Я передаю свои аргументы как

print("Dealer has {0:%r of %s}".format(NumberCard(1, Suit('Club', '♣'))))

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018
NumberCard(1, Suit('Club', '♣'))

Итак, ранг - это int

Вы звоните replace("%r", self.rank)

Ошибка говорит replace() argument 2 must be str, not int

Используйте вместо str(self.rank) вместо

0 голосов
/ 29 апреля 2018

Преобразовать это?

def __format__(self, format_spec):
    if format_spec == "":
        return str(self)
    else:
        result = format_spec.replace("%r", str(self.rank)) # stringify your int
        result = result.replace("%s", str(self.suit.symbol)) # symbol instead class name
        result = result.replace("%%", "%")

Замена работает на replace(str,str) - вы не можете заменить str на int, используя его.

Доку: https://docs.python.org/3.6/library/stdtypes.html#str.replace

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