断言语法错误

时间:2018-01-09 08:58:19

标签: python

尝试使用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

2 个答案:

答案 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

这可能是过度的,但您现在已经注意到如何轻松添加新条件,并添加调试打印以查看完全,其中代码拒绝输入现在非常简单。