Python: тестирование на юникод и преобразование во время () - PullRequest
1 голос
/ 31 марта 2009

Иногда self.start имеет код Unicode:

например.

>>>self.start
u'07:30:00'

Что заставляет datetime.combine жаловаться

start = datetime.combine(self.job_record.date, self.start)

Как это сделать:

  1. Тест на Unicode?
  2. Конвертировать из u'07: 30: 00 'в datetime.time?

Ответы [ 3 ]

4 голосов
/ 31 марта 2009

Проверка на юникод:

>>> import types
>>> type(u'07:30:00') is types.UnicodeType
True
>>> type('regular string') is types.UnicodeType
False

Преобразование строк во время:

>>> import time
>>> time.strptime(u'07:30:00', '%H:%M:%S')
(1900, 1, 1, 7, 30, 0, 0, 1, -1)
2 голосов
/ 31 марта 2009

datetime.combine жалуется, потому что ожидает, что второй аргумент будет datetime.time экземпляром, а не строкой (или строкой Юникода).

Есть несколько способов преобразовать вашу строку в datetime.time экземпляр. Одним из способов было бы использовать datetime.strptime:

t = datetime.strptime(self.start, "%H:%M:%S").time()
start = datetime.combine(self.job_record.date, t)
0 голосов
/ 31 марта 2009

При условии, что в '07: 30: 00 'не будет расширенных символов кодировки, используйте str(self.start).

Если существует вероятность того, что числа во времени зависят от набора символов, используйте encode() с соответствующим спецификатором аргумента error для преобразования в строку.

Это могут быть случаи, когда более питонски сначала пытаться str() и использовать except для обработки дел, которые не могут быть преобразованы (попросите прощения, а не разрешения). Если большинство значений, которые вы пытаетесь преобразовать, не удалось, с другой стороны, сначала преобразуйте их перед применением функции.

Как нежелательное замечание: функция combine ожидает объект datetime.date и объект datetime.time. Если вы действительно хотите избежать непредсказуемого поведения, тогда выполняйте требования API и передайте объекты date и time, а не пытайтесь замкнуть контракт, указанный в документации: преобразуйте аргументы перед вы звоните combine, а не просите combine угадать для вас.

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