0

我编写了一些代码,以便人们可以输入日期。停止输入小于 1 或大于 12 的月份的错误检查应仅在其在这些范围内时返回一个值。如果我输入一些“超出范围”的数字,它会正确地重新要求重新输入一个月,但会返回所有值。到底是怎么回事?

# the question asked to get the month input for the xml updater
def month_q():
    try:
        month = int(input('What was the month [MM] which the installers were  updated/created by xxx?:'))
    except:
        print("That was not a valid number. Please re-enter a 2 digit month")
        month_q()
    updatemonth = month_check(month)
    print("Month q returning:", updatemonth)
    return updatemonth


# check the update month is a valid month
def month_check(month):
    if month < 1:
        print("The month must be a number between 01 and 12. Please re-enter")
        month_q()
    elif month > 12:
        print("The month must be a number between 01 and 12. Please re-enter")
        month_q()
    else:
        print("Month_check returning month:", month)
        return month



# this updates the xml file with the date of the last installer    
def xml_updater():
    updatemonth = month_q()
    print("Update month:", updatemonth)


xml_updater()

结果是在输入正确的月份“12”之前输入坏月份“15”、“14”和“13”是:

What was the month [MM] which the installers were updated/created by xxx?:15
The month must be a number between 01 and 12. Please re-enter
What was the month [MM] which the installers were updated/created by xxx?:14
The month must be a number between 01 and 12. Please re-enter
What was the month [MM] which the installers were updated/created by xxx?:13
The month must be a number between 01 and 12. Please re-enter
What was the month [MM] which the installers were updated/created by xxx?:12
Month_check returning month: 12
Month q returning: 12
Month q returning: None
Month q returning: None
Month q returning: None
Update month: None

到底是怎么回事?

4

2 回答 2

2

你的函数没有返回任何东西;它一次又一次地调用问题函数,但忽略了返回值:

def month_check(month):
    if month < 1:
        print("The month must be a number between 01 and 12. Please re-enter")
        month_q()
    elif month > 12:
        print("The month must be a number between 01 and 12. Please re-enter")
        month_q()
    else:
        print("Month_check returning month:", month)
        return month

如果月份小于 1 或大于 12,函数将返回None(默认)。该语句updatemonth = month_check(month)然后分配Noneupdatemonth并在print("Month q returning:", updatemonth)运行时打印Month q returning: None。但是由于您month_q递归调用,然后返回到上一个month_check()调用,然后None再次返回,依此类推。

这是您的函数的嵌套跟踪,如month_q调用month_check调用month_q等:

month_q():
    What was the month [MM] which the installers were updated/created by xxx?:15
    month_check(15):
        The month must be a number between 01 and 12. Please re-enter
        month_q():
            What was the month [MM] which the installers were updated/created by xxx?:14
            month_check(15):
                The month must be a number between 01 and 12. Please re-enter
                month_q():
                    What was the month [MM] which the installers were updated/created by xxx?:13
                    month_check(13):
                        The month must be a number between 01 and 12. Please re-enter
                        month_q():
                            What was the month [MM] which the installers were updated/created by xxx?:12
                            month_check(12):
                                Month_check returning month: 12
                                <- 12
                            Month q returning: 12
                            <- 12
                        <- None
                    Month q returning: None
                    <- None
                <- None
            Month q returning: None
            <- None
        <- None
    Month q returning: None
    <- None
Update month: None

相反,让检查函数返回 True 或 False 以指示正确的结果,并将要求重新输入的请求留给month_q.

while循环而不是递归来做到这一点;如果你必须经常问,你最终会得到一个递归太深的异常。

def month_q():
    while True:
        try:
            month = int(input('What was the month [MM] which the installers were  updated/created by xxx?:'))
            if not month_check(month):
                raise ValueError()
        except ValueError:
            print("Please re-enter a 2 digit month")
            continue
        print("Month q returning:", month)
        return month


# check the update month is a valid month
def month_check(month):
    if month < 1 or month > 12:
        print("The month must be a number between 01 and 12")
        return False
    return True

您也可以内联该检查:

def month_q():
    while True:
        try:
            month = int(input('What was the month [MM] which the installers were  updated/created by xxx?:'))
            if month < 1 or month > 12:
                raise ValueError()
        except ValueError:
            print("Please re-enter a 2 digit month between 01 and 12.")
            continue
        print("Month q returning:", month)
        return month

使用一揽子except:条款绝不是一个好主意。在上面的代码中,当您输入非整数值时,我会捕获ValueError引发的错误,如果您确实输入了整数但它不是介于 1 和 12 之间的值,则会引发相同的异常。这大大简化了“不是一个月”的错误处理。int()

于 2013-01-21T12:13:12.653 回答
0

尝试这个:

try:
    month = int(input('What was the month [MM] which the installers were  updated/created by xxx?:'))
except:
    print("That was not a valid number. Please re-enter a 2 digit month")
    month_q()
    break

那应该会停止打印不正确的月份

另外,你应该改变

updatemonth = month_check(month)
print("Month q returning:", updatemonth)
return updatemonth

至:

updatemonth = month_check(month)
try:
    updatemonth
except NameError:
    updatemonth = None

if updatemonth is None:
    break
print("Month q returning:", updatemonth)
return updatemonth
于 2013-01-21T12:12:14.107 回答