【问题标题】:Python throws exception reading JSON file into a classPython将读取JSON文件的异常抛出到一个类中
【发布时间】:2021-10-14 23:45:36
【问题描述】:

我有以下 JSON 代码被读入我的 python 文件:

{
        "10":
    {
        "object": 10,
        "singles": [
            {
                "name": "Hello",
                "special_numbers": [1,2,5]
            },
            {
                "name": "World",
                "special_numbers": [1,10]
            }
        ],
        "doubles": []
    }
}

文件由此打开:

objects_config = None

with open("file_objects.json", "r") as file:
    objects_config = json.load(file)

读取它发生在另一个文件中,导致此处底部列出的异常:

// the request.object is a string of 10
object_details = MyClass(**object_config[str(request.object)]["singles"])

这是 JSON 将写入的类:

from typing import List

class MyClass(object):

    name = None
    special_numbers = None

    def __init__(self, name: str, special_numbers: List[int]):
        self.name = name
        self.special_numbers = special_numbers

    #debug
    def __repr__(self):
        return f'<MyClass(name={self.name})>'

例外是这样的:

type object argument after ** must be a mapping, not list

不太清楚 python 的超级新手会发生什么。

【问题讨论】:

  • object["singles"] 是一个列表,而不是字典。 ** 语法用于将字典作为关键字参数传递。您想要列表中的第一项吗?
  • 如果request.object已经是一个字符串,那么传递给str()是没有意义的。
  • 很酷,谢谢。我正在尝试快速学习 python。
  • 如果我忽略 JSON 中的第一行会发生什么?如“对象”:10 部分
  • object_config = None 没有做任何有用的事情。你可以省略它。

标签: python python-3.x python-requests


【解决方案1】:

object_config["10"]["singles"] 会生成 2 个字典的列表,而不是单个字典。为此,您必须构造 2 个对象

singles = object_config[str(request.object)]["singles"]

# Like this
object0_details = MyClass(**singles[0])
object1_details = MyClass(**singles[1])

# Or use a for loop
objects = []
for s in singles:
    objects.append(MyClass(**s))

您还应该研究数据类。它和 MyClass 一样,但代码更好、更简洁。

顺便说一句,这个class MyClass(object): 等于这个class MyClass。据我所知,python 2 需要 (object),但现在不需要了

【讨论】:

  • 好的,但现在我得到:发生异常:TypeError(注意:显示了完整的异常跟踪,但执行暂停在:进程)__init__() 接受 3 个位置参数,但给出了 4 个
  • 一开始没有测试正确,回答错误。已更新,现在应该是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多