如何在没有许多嵌套 try...excepts 的情况下将字符串转换为日期时间?

How do I convert a string to a datetime without many nested try...excepts?

我正在尝试以多种允许的格式检查 date/time 的用户输入。 (我知道 dateutil 库。在这种情况下,这不是我要找的。)

如果某些用户输入被接受,该函数必须return一个日期时间对象。

如果所有“try...except”都失败了 — 函数必须 return NONE。但是我有 30-50 种不同的 date/time 格式需要检查。

我对代码中的巨大缩进感到困惑!我如何组织此格式检查以良好的风格和良好的性能


# Test format check program
import datetime

def datetime_format_check(str):
    try:
        dt = datetime.datetime.strptime(str, "%y-%m-%d %H:%M")
        return dt
    except:
        try:
            dt = datetime.datetime.strptime(str, "%Y-%m-%d %H:%M")
            return dt
        except:
            try:
                dt = datetime.datetime.strptime(str, "%y-%m-%d")
                return dt
            except:
                try:
                    dt = datetime.datetime.strptime(str, "%Y-%m-%d")
                    return dt
                except:
                    try:
                        dt = datetime.datetime.strptime(str, "%H:%M")
                        return dt
                    except:
                        try:
                               # . . .
                               # many many try...except blocks )))
                               # . . .
                                   return None  # last except far far away from a screen border. ))))

while True:
    str = input("Input date: ")
    print("Result: ", datetime_format_check(str))

重复代码?好吧,那只是请求用循环代替。

将所有格式放在一个列表中并对其进行迭代,检查每种格式:

def datetime_format_check(s):
    formats = ["%y-%m-%d %H:%M", "%Y-%m-%d %H:%M", "%y-%m-%d"] # etc
    for format in formats:
        try:
            dt = datetime.datetime.strptime(s, format)
            return dt
        except ValueError:
            pass
    return None

我对您的代码做了一些小的更正:

  • 不要说出你的论点 str;它隐藏了内置的。
  • 不要使用裸 except:,总是捕获特定的异常。