如何在没有许多嵌套 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:
,总是捕获特定的异常。
我正在尝试以多种允许的格式检查 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:
,总是捕获特定的异常。