Использование __repr__, когда параметр по умолчанию имеет значение None, но может быть - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть класс, который можно инициализировать несколькими параметрами.Некоторые из этих параметров имеют значения по умолчанию None, но если указано значение, оно должно быть str.Я хотел бы получить хороший питонический вывод из __repr()__, но не могу понять, как обрабатывать None, а также возможный str в одном операторе возврата.Я хотел бы избежать использования различных операторов возврата в зависимости от того, является ли параметр None или str значением.

Базовый пример:

class Demo:
    """Demo of how not to deal with None in __repr()__"""

    def __init__(self, w:int, x:int, y=None, z=None):
        self.w = w
        self.x = x
        self.y = y
        self.z = z

    def __repr__(self):
        return f"demo(w={self.w}, x={self.x}, y='{self.y}', z='{self.z}')"

Вот два примера использования этого класса:

>>> d1 = Demo(5, 4)
>>> d1
Demo(w=5, x=4, y='None', z='None')
>>> d2 = Demo(5, 4, 'me', 'you')
>>> d2
Demo(w=5, x=4, y='me', z='you')

Обратите внимание, что None в одинарных кавычках, что нечто я хочу.Но me и you заключены в кавычки, что уместно, учитывая, что они str.

1 Ответ

0 голосов
/ 28 февраля 2019

используйте repr в вашей __repr__ функции

def __repr__(self):
    return f"demo(w={self.w}, x={self.x}, y={repr(self.y)}, z={repr(self.z)})"

test:

d = Demo(23,12,y='hello')
print(d)

demo(w=23, x=12, y='hello', z=None)
...