如何在python中获取特定数据集的内容类型(或变量类型)?

如何在python中获取特定数据集的内容类型(或变量类型)?,python,types,Python,Types,假设您有一个如下所示的字典,那么获取字典中每个项的变量类型的最佳方法是什么 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'] = '...' 所需的输出将是:

假设您有一个如下所示的字典,那么获取字典中每个项的变量类型的最佳方法是什么

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 -> ...

首先,永远不要使用
dict
作为变量的名称,因为它会隐藏内置项(是的,我就是这样一个纳粹:-)

使用ast模块中的文字值

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
建议,因为这是一项巨大的安全责任(例如,考虑在
“\uuu import\uuuu('os').system('rm-rf/')”
这样的字符串上使用eval的后果)

结果:

- Item1 -> string
- Item2 -> datetime
- Item3 -> string
- Item4 -> int
- Item5 -> bool
- Item6 -> NoneType
- Item7 -> dict
- Item8 -> string
- Item9 -> Ellipsis

检测像URL这样的特殊字符串留给读者作为练习(对于正则表达式来说可能是一项很好的工作)。

首先,不要使用
dict
作为变量名,它会隐藏内置项(是的,我就是这样一个纳粹:-)

使用ast模块中的文字值

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
建议,因为这是一项巨大的安全责任(例如,考虑在
“\uuu import\uuuu('os').system('rm-rf/')”
这样的字符串上使用eval的后果)

结果:

- Item1 -> string
- Item2 -> datetime
- Item3 -> string
- Item4 -> int
- Item5 -> bool
- Item6 -> NoneType
- Item7 -> dict
- Item8 -> string
- Item9 -> Ellipsis

检测像URL这样的特殊字符串留给读者作为练习(对于正则表达式来说可能是一项很好的工作)。

您可以使用type(x)来获取变量x的类型。如上所述,问题中所有值的类型都是STR。为了使用Type(),需要将字符串解析成所需的对象。如果字符串格式是固定的,请考虑使用<代码> ReGeXP。您可以在中找到所需内容。:)您可以使用type(x)获取变量x的类型。如上所述,问题中所有值的类型都是STR。为了使用Type(),需要将字符串解析成所需的对象。如果字符串格式是固定的,请考虑使用<代码> ReGeXP。你可以从中找到你想要的。:)