Nad*_*mli 14
你可以这样做:
from datetime import datetime
tests = [
# (Type, Test)
(int, int),
(float, float),
(datetime, lambda value: datetime.strptime(value, "%Y/%m/%d"))
]
def getType(value):
for typ, test in tests:
try:
test(value)
return typ
except ValueError:
continue
# No match
return str
>>> getType('2010/1/12')
<type 'datetime.datetime'>
>>> getType('2010.2')
<type 'float'>
>>> getType('2010')
<type 'int'>
>>> getType('2013test')
<type 'str'>
Run Code Online (Sandbox Code Playgroud)
关键是在测试顺序中,例如int测试应该在浮动测试之前.对于日期,您可以为要支持的格式添加更多测试,但显然您无法涵盖所有可能的情况.
这不能以可靠的方式完成,并且不是由于Python或任何其他编程语言的限制.如果没有猜测并遵循一些规则(在此上下文中使用时通常称为启发式),人类无法以可预测的方式执行此操作.
因此,首先设计一些启发式,然后在Python中对它们进行编码.需要考虑的事项是:
[YYYY]-[MM]-[DD].(ISO ISO 8601日期格式),它们很容易与包含数字的其他文本位区分开来.如果日期的格式只有那样的数字,YYYYMMDD那么我们就会陷入困境,因为这些日期与普通数字无法区分.3.14159265为浮点数.然而5.0,它可以简单地写成5也是一个有效的浮点数,但是在前面的步骤中会被捕获,并且即使它是预期的也不会被识别为浮点数.由于我上面提到的可能的重叠,这样的方案永远不可能100%可靠.此外,您需要支持的任何新数据类型(可能是复数)都需要自己的一组启发式算法,并且必须放在检查链中最合适的位置.检查越有可能只匹配所需的数据类型,它应该是链上面的更高位置.
现在让我们在Python中实现这一点,我上面提到的大部分启发式方法都是由Python为我们处理的,我们只需要决定应用它们的顺序:
from datetime import datetime
heuristics = (lambda value: datetime.strptime(value, "%Y-%m-%d"),
int, float)
def convert(value):
for type in heuristics:
try:
return type(value)
except ValueError:
continue
# All other heuristics failed it is a string
return value
values = ['3.14159265', '2010-01-20', '16', 'some words']
for value in values:
converted_value = convert(value)
print converted_value, type(converted_value)
Run Code Online (Sandbox Code Playgroud)
这输出如下:
3.14159265 <type 'float'>
2010-01-20 00:00:00 <type 'datetime.datetime'>
16 <type 'int'>
some words <type 'str'>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6049 次 |
| 最近记录: |