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

标签 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'] = '...'

期望的输出是:

 - item1 -> string
 - item2 -> date
 - item3 -> string(url)
 - item4 -> number
 - item5 -> boolean
 - itemN -> ...

最佳答案

首先,永远不要使用 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') 这样的字符串使用 eval 的后果.system('rm -rf/')" 例如)。

结果:

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

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

关于python - 如何在 python 中获取特定数据集的内容类型(或变量类型)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22417123/

相关文章:

python - Django:模板中的两个 FormView

python - 如何使用 kubernetes 和 skaffold 调试 python 代码?

python - 为什么我不能使用 `tests` 从我的 python 轮中排除 `exclude` 目录?

c# - 固定长度的字符串作为值类型用于 MemoryMappedViewAccessor

haskell - 容器元素类型

python - 如何让 pip 再次工作?

python - 如何在不破坏浏览器后退按钮的情况下正确重定向到另一个站点?

R:使用因子

language-agnostic - 何时使用无符号值而不是有符号值?

java - 在 Java 中确定 'type'