1

可能这是一个常见问题,但我是 python 新手!

我正在研究一些处理 json 查询的库,并问自己是否有一些最佳实践来避免对大量 json 键进行硬编码,例如:


# just an example..
var1 = response.json()["ACRI"]["message"]["title"]
var2 = response.json()["ACRI"]["message"]["content"]
var3 = response.json()["ACRI"]["message"]["meta"]["timestamp"]

当我看到它时,它不喜欢我,我创建了一个带有常量的类,例如:


class _const:
    class headers:
        X_Auth_Token = "X-Auth-Token"
        X_Username = 'X-Username'
        X_Password = 'X-Password'

    class params:
        ID = "DocumentID"
        Symbols = "Symbols"
        ACRICode = "ACRICode"rketSegmentID"
        entries = "entries"
        depth = "depth"
        date = "date"
        meta = "meta"
        timestamp = "timestamp"
        message = "message"
        # ...

这是一个好习惯吗?关于python编译器有什么我不了解的吗?

谢谢

编辑:我尤其面临性能和/或内存消耗最佳实践

4

4 回答 4

1

性能应该是您最不关心的问题,可维护性更重要。为字符串使用符号名称的一个很好的理由是,您不能那么容易地拼写错误,cf

KEY_SYMBOLS = "Symbols"

foo[KEY_SYMOBLS]

对比

foo["Symobls"]

IDE 或 linter 甚至可以在运行代码之前找到前一个错字并突出显示它,但后一个错字不太可能。


在性能方面,性能最高的 Python 代码是将字符串存储在变量中的代码。在编译时,同一模块中同一字符串的不同用途被合并以仅引用一个字符串常量:

>>> 'foo' is 'foo'
True

尽管如此,切普纳的回答中提出的观点仍然存在:您不必不必要地从根中解析子字典。

于 2019-05-04T19:36:47.477 回答
1

您的初始策略非常符合 Python 之禅。它的可读性很强,任何使用 Python 的人都会立即理解它。但是,您的第二个示例过于复杂且难以理解。

也就是说,可以解析 json 使其成为具有属性的对象,而不是具有键的 dict。您的代码将如下所示:

import json
from collections import namedtuple

x = json.loads(response, object_hook=lambda d: namedtuple('X', d.keys())(*d.values()))

var1 = x.ACRI.message.title
var2 = x.ACRI.message.content
var3 = x.ACRI.message.meta.timestamp

或者,定义一个简单的类来处理它:

import json

class x(object):
    def __init__(self, j):
        self.__dict__ = json.loads(j)

var1 = x.ACRI.message.title
var2 = x.ACRI.message.content
var3 = x.ACRI.message.meta.timestamp
于 2019-05-04T23:10:44.587 回答
0

如果从文件中读取 JSON 数据,请使用以下代码片段。

with open("config.json") as json_data_file:
    json_text = json_data_file.read()
    json_data = json.loads(json_text, object_hook=lambda d: namedtuple('X', d.keys())(*d.values()))

# Access data using below format 
var1 = json_data.key1.subkey1
var2 = json_data.key2.subkey2
于 2021-05-05T13:25:49.763 回答
0

每个嵌套的 dict 都是一个可以存储引用的 dict。

resp = response.json()["ACRI"]["message"]
var1 = resp["title"]
var2 = resp["content"]
var3 = resp["meta"]["timestamp"]
于 2019-05-04T19:18:51.747 回答