gpt4 book ai didi

Python 在列表理解中引发错误(或更好的替代方案)

转载 作者:行者123 更新时间:2023-11-30 21:59:36 24 4
gpt4 key购买 nike

我有一个从 json 字符串读取的嵌套结构,看起来类似于以下内容...

[
{
"id": 1,
"type": "test",
"sub_types": [
{
"id": "a",
"type": "sub-test",
"name": "test1"
},
{
"id": "b",
"name": "test2",
"key_value_pairs": [
{
"key": 0,
"value": "Zero"
},
{
"key": 1,
"value": "One"
}
]
}
]
}
]

我需要提取并透视数据,准备插入数据库......

[
(1, "b", 0, "Zero"),
(1, "b", 1, "One")
]

我正在执行以下操作...

data_list = [
(
type['id'],
sub_type['id'],
key_value_pair['key'],
key_value_pair['value']
)
for type in my_parsed_json_array
if 'sub_types' in type
for sub_type in type['sub_types']
if 'key_value_pairs' in sub_type
for key_value_pair in sub_type['key_value_pairs']
]

到目前为止,一切顺利。

但是,我接下来需要做的是强制执行一些约束。例如...

if type['type'] == 'test': raise ValueError('[test] types can not contain key_value_pairs.')

但我无法将其放入理解中。而且我不想诉诸循环。到目前为止我最好的想法是......

def make_row(type, sub_type, key_value_pair):
if type['type'] == 'test': raise ValueError('sub-types of a [test] type can not contain key_value_pairs.')
return (
type['id'],
sub_type['id'],
key_value_pair['key'],
key_value_pair['value']
)

data_list = [
make_row(
type,
sub_type,
key_value_pair
)
for type in my_parsed_json_array
if 'sub_types' in type
for sub_type in type['sub_types']
if 'key_value_pairs' in sub_type
for key_value_pair in sub_type['key_value_pairs']
]

这可行,但它会对每个 key_value_pair 进行检查,这感觉是多余的。 (每组键值对可能有数千对,只需检查一次即可知道它们都没有问题。)

此外,还有与此类似的其他规则,适用于层次结构的不同级别。例如“test”类型只能包含“sub_test”子类型。

除了上述之外还有哪些选项?

  • 更优雅?
  • 更具可扩展性?
  • 性能更高?
  • 更“Pythonic”?

最佳答案

您应该阅读有关如何验证 json 数据并使用以下命令指定显式架构约束的信息: JSON Schema该库允许您设置所需的键、指定默认值、添加类型验证等。

这个库有它的Python实现在这里: jsonschema package

示例:

from jsonschema import Draft6Validator

schema = {
"$schema": "https://json-schema.org/schema#",

"type": "object",
"properties": {
"name": {"type": "string"},
"email": {"type": "string"},
},
"required": ["email"]
}
Draft6Validator.check_schema(schema)

关于Python 在列表理解中引发错误(或更好的替代方案),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54531254/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com