python中的智能类型转换

2024-06-01 00:54:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在进行api调用并接收json格式的响应,如下所示

result = {'foo': '123.456', 'bar': '23', 'donald': 'trump', 'time': '2016-04-07T05:31:49.532124Z'}

尽管结果是字典或列表,但内容始终是字符串。我想将这些值转换为适当的类型。(即'123.456'为浮点,'23'为int,'time'为datetime。)

我的代码可以工作,但似乎应该有一种更简单/更有效的方法来实现这一点。有?在

这是我的版本

^{pr2}$

编辑:如果可能的话,我想避免使用try和{}。我想把它实现到一个异步twisted程序中,我认为try和{}块使程序同步。我刚接触过twisted,所以我不确定这是不是真的。在


根据Francesco的解决方案,下面是更新后的代码。在

from dateutil.parser import parse

def smartcast(x):
    if isinstance(x, dict):
        return { k:smartcast(v) for k, v in x.items() }
    elif isinstance(x, list):
        return map(smartcast, x)
    else:
        for t in [int, float, parse]:
            try:
                return t(x)
            except ValueError:
                continue
    return x

Tags: 代码in程序apijsonforreturntime
2条回答

使用呢ast.literal_评估()? 在

https://docs.python.org/2/library/ast.html#ast.literal_eval

投票赞成弗朗西斯科的回答。你需要一个异常。在

什么是合适的类型?我要求这样做是为了强调,有时人类也不清楚它的类型是什么:你确定“42”总是一个int,还是有时候它必须被看作是一个字符串?在

总之,正如您所做的那样,您可以使用在您的上下文中有意义的规则来构建解决方案。在

在你的例子中,你可以用一个简单的循环来简化你的代码

from dateutil.parser import parse

tests = [int, float, parse]

def smartcast(value):
     for test in tests:
         try:
             return test(value)
         except ValueError:
             continue
     # No match
     return value

相关问题 更多 >