假设您有一个类似下面的字典,那么获取字典中每个项目的变量类型的最佳方法是什么?
dict = {}
dict['item1'] = 'the book is on the table'
dict['item2'] = '2014-03-14 22:10:00'
dict['item3'] = 'https://foo.com/bar.jpg'
dict['item4'] = '23449'
dict['item5'] = 'True'
dict['itemN'] = '...'
所需的输出是:
- item1 -> string
- item2 -> date
- item3 -> string(url)
- item4 -> number
- item5 -> boolean
- itemN -> ...
答案 0 :(得分:4)
首先,永远不要使用dict
作为变量的名称,它会影响内置函数(是的,我是个天真的: - )。
使用ast模块中的literal_eval。
from ast import literal_eval
from dateutil import parser
def guess_type(v):
if v == '...':
return 'Ellipsis'
try:
return type(literal_eval(v)).__name__
except (SyntaxError, ValueError):
try:
return type(parser.parse(v)).__name__
except ValueError:
pass
return 'string'
data = [
'the book is on the table',
'2014-03-14 22:10:00',
'https://foo.com/bar.jpg',
'23449',
'True',
'None',
'{"foo": 1}',
'{"foo"}',
'...',
]
for i, item in enumerate(data):
print('- Item{} -> {}'.format(i+1, guess_type(item)))
一定要避免来自其他答案的eval
建议,因为这是一个巨大的安全责任(例如考虑在像"__import__('os').system('rm -rf /')"
这样的字符串上使用eval的后果。)
结果:
- Item1 -> string
- Item2 -> datetime
- Item3 -> string
- Item4 -> int
- Item5 -> bool
- Item6 -> NoneType
- Item7 -> dict
- Item8 -> string
- Item9 -> Ellipsis
检测URL之类的特殊字符串是留给读者的练习(也许是正则表达式的好工作)。