freeze_time 不适用于默认参数
freeze_time not working for default param
我有一个参数默认值为 datetime.now()
的函数。方法如下所示,
def as_standard_format(p_date=datetime.now(), fmt=sdk_constants.DEFAULT_DATE_TIME_FORMAT):
return p_date.strftime(fmt)
我有一个类似下面的测试方法,
@freeze_time(datetime(year=2018, month=9, day=25, hour=15, minute=46, second=36))
def testNowWithDefaultFormat(self):
# The below method gives the frozen time
print(datetime.now())
# But the below test fails
assert utils.format_date(
datetime.now()) == "20180925T154636Z", "Default call not giving current time in " \
"standard format \"%Y%m%dT%H%M%SZ\""
为什么 freeze_time
不能使用默认参数值?
您是 Python 中与可变默认值参数相关的 common gotcha 的受害者,而不仅仅是 freeze_time
。
为了解释,请考虑以下代码:
import time from datetime import datetime
def what_time_is_it(p_date=datetime.now()):
return p_date.strftime('"%Y-%m-%d %X"')
if __name__ == '__main__':
print(what_time_is_it())
time.sleep(10)
print(what_time_is_it())
你可能预料到会发生什么
"2019-02-28 13:47:24"
"2019-02-28 13:47:34" # This line showing a datetime 10 seconds after the first one
每次调用 what_time_is_it()
都会调用一个新的 datetime.now()
发生了什么
"2019-02-28 13:47:24"
"2019-02-28 13:47:24" # EXACTLY the same time in both lines!
定义函数时创建一次新的datetime.now()
,并在每次后续调用中使用相同的值。
你应该怎么做?
每次调用函数时创建一个新对象,通过使用默认参数来表示没有提供参数(None 通常是一个不错的选择) :
def as_standard_format(p_date=None, fmt=sdk_constants.DEFAULT_DATE_TIME_FORMAT):
if p_date is None:
return datetime.now().strftime(fmt)
else:
return p_date.strftime(fmt)
我有一个参数默认值为 datetime.now()
的函数。方法如下所示,
def as_standard_format(p_date=datetime.now(), fmt=sdk_constants.DEFAULT_DATE_TIME_FORMAT):
return p_date.strftime(fmt)
我有一个类似下面的测试方法,
@freeze_time(datetime(year=2018, month=9, day=25, hour=15, minute=46, second=36))
def testNowWithDefaultFormat(self):
# The below method gives the frozen time
print(datetime.now())
# But the below test fails
assert utils.format_date(
datetime.now()) == "20180925T154636Z", "Default call not giving current time in " \
"standard format \"%Y%m%dT%H%M%SZ\""
为什么 freeze_time
不能使用默认参数值?
您是 Python 中与可变默认值参数相关的 common gotcha 的受害者,而不仅仅是 freeze_time
。
为了解释,请考虑以下代码:
import time from datetime import datetime
def what_time_is_it(p_date=datetime.now()):
return p_date.strftime('"%Y-%m-%d %X"')
if __name__ == '__main__':
print(what_time_is_it())
time.sleep(10)
print(what_time_is_it())
你可能预料到会发生什么
"2019-02-28 13:47:24"
"2019-02-28 13:47:34" # This line showing a datetime 10 seconds after the first one
每次调用 what_time_is_it()
datetime.now()
发生了什么
"2019-02-28 13:47:24"
"2019-02-28 13:47:24" # EXACTLY the same time in both lines!
定义函数时创建一次新的datetime.now()
,并在每次后续调用中使用相同的值。
你应该怎么做?
每次调用函数时创建一个新对象,通过使用默认参数来表示没有提供参数(None 通常是一个不错的选择) :
def as_standard_format(p_date=None, fmt=sdk_constants.DEFAULT_DATE_TIME_FORMAT):
if p_date is None:
return datetime.now().strftime(fmt)
else:
return p_date.strftime(fmt)