是否有一种方法可以让我将给定的值解析为所选的类型?
它可能是一个以类似方式工作的库。
如果没有方法,我如何创建类似的东西?
示例(解析list[str]到list[int]):
# could be a value of ANY type
value: list[str] = ['1', '2', '3']
# can be any other type
parse_to_type = list[int]
# makes best effort to parse
parsed_value = universal_parser(value, parse_to_type)
# parses or raises error
# parsed_value = [1, 2, 3]
请记住,我不想要一个神奇的函数,与Pydantic lib相比,具有解析能力的函数就足够了。Pydantic本身能够从列表[str]解析到列表[int],但我无法在代码中找到它是如何对任何类型进行解析的。
我知道我可以使用int(value)
或float(value)
(一般是annotation(value)
)。但是对于复杂的嵌套类型,不起作用如:list[int]
,dict[str, str | int]
.
我发现我可以动态地创建Pydantic模型,我可以使用它来利用它的解析能力。
下面是一个简单的实现
import typing
from pydantic import create_model
def universal_parser(value: typing.Any, annotation: type):
"""
the return type is an instance of the annotation (don't know how to write it)
"""
Parser = create_model('Parser', parsed=(annotation, ...))
model = Parser(parsed=value)
return model.parsed
print(universal_parser(['1', '2', '3'], list[int]))
这解决了我的问题,因为Pydantic的解析能力正是我想要的。尽管这让我想知道Pydantic是如何解析这些东西的。请记住,这不仅对list[int]有效,而是Pydantic能够解析的任何类型,如datetime, float, dict等等。