我有一个包含字符串的变量(从XML提要中提取)。字符串值可以是整数,日期或字符串。我需要将它从字符串转换为给定的数据类型。我这样做,但它有点难看,所以我问是否有更好的技术。如果我要检查更多类型,我将以非常嵌套的try - except blocks结束。
def normalize_availability(self, value):
"""
Normalize the availability date.
"""
try:
val = int(value)
except ValueError:
try:
val = datetime.datetime.strptime(value, '%Y-%m-%d')
except (ValueError, TypeError):
# Here could be another try - except block if more types needed
val = value
谢谢!
答案 0 :(得分:5)
使用方便的辅助功能。
def tryconvert(value, default, *types):
"""Converts value to one of the given types. The first type that succeeds is
used, so the types should be specified from most-picky to least-picky (e.g.
int before float). The default is returned if all types fail to convert
the value. The types needn't actually be types (any callable that takes a
single argument and returns a value will work)."""
value = value.strip()
for t in types:
try:
return t(value)
except (ValueError, TypeError):
pass
return default
然后编写一个解析日期/时间的函数:
def parsedatetime(value, format="%Y-%m-%d")
return datetime.datetime.striptime(value, format)
现在把它们放在一起:
value = tryconvert(value, None, parsedatetime, int)
答案 1 :(得分:0)
正确的方法是从xml知道每个应该是什么类型。这可以防止碰巧是数字字符串的东西最终变成int等。但是假设这是不可能的。
对于int类型我更喜欢
if value.isdigit():
val = int(value)
对于这个日期,我能想到的唯一另一种方法是将它拆分并查看部件,这样会更加混乱,然后让strptime引发异常。
答案 2 :(得分:0)
def normalize_availability(value):
"""
Normalize the availability date.
"""
val = value
try:
val = datetime.datetime.strptime(value, '%Y-%m-%d')
except (ValueError):
if value.strip(" -+").isdigit():
val = int(value)
return val