2012-01-29 1 views
1

У меня есть (в Python 3):перекрывая формат по умолчанию при печати списка объектов DateTime

print('event {} happened on these dates: {}'.format(event_name, date_list)) 

Мой date_list список datetime.date объектов. Я хотел бы изменить формат с:

события А произошло на [datetime.date (2011, 5, 31), datetime.date (2011, 6, 15)]

к

событие А произошло [2011-05-31, 2011-06-15]

Какой самый лучший способ для достижения этой цели? Я надеялся, что смогу продолжать использовать функцию format(), но я не вижу, как это сделать.

ответ

5

Печать списка дает repr элементов внутри списка. Чтобы получить str представление элементов, вы должны явно вызывать str по пунктам:

In [6]: import datetime as dt 

In [7]: date_list = [dt.date(2011, 5, 31), dt.date(2011, 6, 15)] 

In [8]: print('[{}]'.format(', '.join(map(str,date_list)))) 
[2011-05-31, 2011-06-15] 
+0

Понял ... это много повторяющихся 'join' называет, хотя. Это хорошая идея для подкласса 'datetime.date' переопределить' __repr__', поэтому он просто называет '__str__'? – max

+0

На самом деле это только один вызов 'join', хотя (возможно) много вызовов' str'. Подклассификация 'datetime.date', поэтому' __repr__' возвращает 'str (self)', но это возможно только в том случае, если вам нравится более простой синтаксис, а не скорость. Фактически, использование подкласса было бы медленнее, так как каждый вызов '__repr__' вызывал бы вызов' str'. Фактически, вы будете делать столько же вызовов 'str', как указано выше, плюс накладные расходы на равное количество вызовов' __repr__'. Во всяком случае, не беспокойтесь о скорости, пока вы не профилировали и не определили основные узкие места. Я сомневаюсь, что он будет здесь. – unutbu

+0

Мне жаль, что я имел в виду «повторяющийся» в смысле написания кода, а не исполнение :) У меня есть много мест, где я печатаю список дат ... Поэтому кажется, что для моих целей это не так уж плохо подкласс. Благодаря! – max

Смежные вопросы