Как избежать жесткого кодирования множества строк ключевых слов в Python - PullRequest
0 голосов
/ 04 мая 2019

Может быть, это общий вопрос, но я новичок в python!

Я работаю над некоторыми библиотеками, которые обрабатывают запросы json, и спросил себя, есть ли лучшая практика, чтобы избежать жесткого кодирования множества тоннjson key вроде:


# 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?

Спасибо

edit: я сталкиваюсь с рекомендациями по производительности и / или потреблению памяти, особенно

Ответы [ 3 ]

1 голос
/ 04 мая 2019

Производительность должна быть Наименьшая из ваших проблем , ремонтопригодность важнее. Хорошая причина использовать символическое имя для строки в том, что вы не можете так легко ее опечатать, c.f.

KEY_SYMBOLS = "Symbols"

foo[KEY_SYMOBLS]

против

foo["Symobls"]

Среда IDE или линтер могут найти первую опечатку и выделить ее еще до запуска кода, но, скорее всего, не последнюю.


Когда дело доходит до производительности, наиболее производительный код Python - это тот, который не хранит строки в переменных. При компиляции различные использования одной и той же строки в одном модуле объединяются для ссылки только на одну строковую константу:

>>> 'foo' is 'foo'
True

Тем не менее, вопрос, поднятый в ответе Чепнера, остается: вам не нужно разыскивать поддиктарии из корня без необходимости.

1 голос
/ 05 мая 2019

Ваша начальная стратегия очень хорошо следует за Дзен Питона .Он очень читабелен, и любой, кто использует Python, поймет это сразу.Ваш второй пример, однако, слишком сложен и труден для понимания.

Тем не менее, можно проанализировать json, чтобы он стал объектом с атрибутами вместо слов с ключами,Ваш код будет выглядеть примерно так:

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
0 голосов
/ 04 мая 2019

Каждый вложенный диктов - это диктовка, на которую вы можете сохранить ссылку.

resp = response.json()["ACRI"]["message"]
var1 = resp["title"]
var2 = resp["content"]
var3 = resp["meta"]["timestamp"]
...