Есть несколько проблем.
Прежде всего, способ, которым вы используете mock.patch
, не совсем прав. При использовании в качестве декоратора он заменяет данную функцию / класс (в данном случае datetime.date.today
) объектом Mock
только внутри декорированной функции . Таким образом, только в пределах вашей today()
будет datetime.date.today
быть другой функцией, которая, кажется, не является тем, что вы хотите.
То, что вы действительно хотите, похоже, больше похоже на это:
@mock.patch('datetime.date.today')
def test():
datetime.date.today.return_value = date(2010, 1, 1)
print datetime.date.today()
К сожалению, это не сработает:
>>> test()
Traceback (most recent call last):
File "", line 1, in
File "build/bdist.macosx-10.6-universal/egg/mock.py", line 557, in patched
File "build/bdist.macosx-10.6-universal/egg/mock.py", line 620, in __enter__
TypeError: can't set attributes of built-in/extension type 'datetime.date'
Это не работает, потому что встроенные типы Python неизменяемы - см. этот ответ для более подробной информации.
В этом случае я буду подклассифицировать datetime.date самостоятельно и создать правильную функцию:
import datetime
class NewDate(datetime.date):
@classmethod
def today(cls):
return cls(2010, 1, 1)
datetime.date = NewDate
И теперь вы можете сделать:
>>> datetime.date.today()
NewDate(2010, 1, 1)
Я думал, что исследование ChrisW было правильным, и попытался подтвердить его, сделав то же самое. Я нашел имя Джона Вудса в 1991 году в этой теме: Использование оператора запятой
Билл Митчелл Просмотреть профиль Подробнее варианты 26 сен 1991, 1:57 утра В статья < 5 ... @ ksr.com > j ... @ ksr.com (Джон Ф. Вудс) пишет:
[...] Всегда кодируйте так, как будто парень, который в конечном итоге будет поддерживать ваш код, будет жестокий психопат, который знает, где вы живете. Код для удобочитаемости.
Черт возьми!
Так может быть, Джон Вудс?
22 августа 2014 г .: Ссылка обновлена.
Его самое раннее появление в Группах Google не упоминается в подписи к сообщению Мартина Голдинга в 1994 году.