尝试使用assert进行测试时出现以下行的语法错误。
#test is_valid_date for April 4, 2014 and Januarary 3, 2012
print assert(is_valid_date(2014,4,4))
print assert(is_valid_date(2012,1,3))
如果函数is_valid_date
返回true,那么断言是否应该返回true?
以下是实际的is_valid_date
实施。
def is_valid_date(year, month, day):
"""
Inputs:
year - an integer representing the year
month - an integer representing the month
day - an integer representing the day
Returns:
True if year-month-day is a valid date and
False otherwise
"""
if year > datetime.MINYEAR and year < datetime.MAXYEAR:
if month >= 1 and month <= 12:
d = days_in_month(year, month)
if day >= 1 and day <= d:
return True
return False
答案 0 :(得分:2)
assert
不是函数,它是一个语句,因此不能在print
的表达式中使用。
您可能想要做的是:
is_valid = is_valid_date(2014, 4, 4)
print is_valid
assert is_valid
也就是说,首先执行print
语句,然后执行assert
语句(但是,对于只返回True或False的函数,在打印返回值之前没有多大好处断言)。
如果您发现自己经常编写代码,可以考虑编写自己的实用程序函数:
def verbose_assert(value):
print value
assert value
verbose_assert(is_valid_date(2014, 4, 4))
或者甚至喜欢这样:
def assert_is_valid_date(*args):
is_valid = is_valid_date(*args)
print is_valid
assert is_valid
assert_is_valid_date(2014, 4, 4)
答案 1 :(得分:1)
您期望assert
返回什么,为什么要print
该值?你的用法不是很惯用。取出print
并将您正在测试的内容的描述添加到assert
作为其第二个参数。
assert is_valid_date(2014,4,4), "2014,4,4 is a valid date tuple"
assert is_valid_date(2012,1,3), "2012,1,3 is a valid date tuple"
切线,也许你想重构你的函数以避免arrow antipattern
def is_valid_date(year, month, day):
"""
Inputs:
year - an integer representing the year
month - an integer representing the month
day - an integer representing the day
Returns:
True if year-month-day is a valid date and
False otherwise
"""
if year <= datetime.MINYEAR:
return False
if year >= datetime.MAXYEAR:
return False
if month < 1:
return False
if month > 12:
return False
if day < 1:
return False
if day > days_in_month(year, month):
return False
return True
这可能是过度的,但您现在已经注意到如何轻松添加新条件,并添加调试打印以查看完全,其中代码拒绝输入现在非常简单。