Несколько выходных форматов для __str__ - PullRequest
2 голосов
/ 01 марта 2020

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

Как я могу это сделать? Может ли __str__ принимать параметры (я в порядке, давая им значения по умолчанию)? Как эти параметры будут переданы, когда пользователь print(my_class_instance)?

1 Ответ

0 голосов
/ 02 марта 2020

Самый распространенный способ сделать это в python - это определить a __format__ метод , чтобы вы могли использовать спецификаторы формата так же, как "{:05.3f}" может форматировать числа с плавающей запятой.

Если вам нужно только 2 представления, одно из которых должно быть более удобным для пользователя, а другое - более наглядным, вы можете обойтись без простого определения __str__ и __repr__, для контекста используется __repr__ при отображении значений в интерактивном терминале или при вызове repr или использовании "{0!r}".format.

Вот пример кода для начала работы:

class Demo:
    def __init__(self, a,b):
        self.a = a
        self.b = b
    def __repr__(self):
        # should usually have a repr method to show code representation
        return "Demo({0.a!r}, {0.b!r})".format(self)
    def __str__(self):
        # str should give user friendly representation, default format
        return "Demo()"
    def __format__(self, spec):
        # format for more specific details
        if spec == "": # usually empty spec should be equivalent to str.
            return str(self)
        elif spec == "d":
            return "(a:{0.a}, b:{0.b})".format(self)
        else:
            raise NotImplementedError("unsupported spec: {!r}".format(spec))

x = Demo("A", "B")
print("str: {0}, repr: {0!r}, spec='d': {0:d}".format(x))

print("WILL THROW ERROR: {0:OTHER_SPEC}".format(x))

Вы можете сделать любой формат c вы sh, то, что будет передано в спецификатор, будет передано методу __format__ в виде строки.

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