Вопрос о преобразовании JSON / dict в Python

Я использую библиотеку jsondiff, которая возвращает следующий результат:

a = {'TIERS': {delete: ['APP']}}

Я не понимаю, как это действительное представление dict (или JSON, если на то пошло)? Разве это не должно произойти, потому что delete не в кавычках? однако, похоже, это верный словарь.

это полный файл библиотеки: https://github.com/ZoomerAnalytics/jsondiff/blob/master/jsondiff/в этом.py

соответствующие части библиотеки (по крайней мере, из того, что я могу собрать):

    def emit_dict_diff(self, a, b, s, added, changed, removed):
        if s == 0.0:
            return b
        elif s == 1.0:
            return {}
        else:
            d = {}
            if added:
                d[insert] = added
            if changed:
                d[update] = changed
            if removed:
                d[delete] = list(removed.keys())

когда я использую опцию dump (json.dump output) для этой библиотеки, результат будет следующим:

a = '{"TIERS": {"$delete": ["APP"]}}'

Я не могу найти ничего по этому типу синтаксиса и понимаю, что это может быть googlable, извините, если этот вопрос кажется ленивым.

редактировать:

  • Python 3.6+
  • Библиотека jsondiff используется как a=jsondiff.diff(json1,json2,load=True)

Может быть, delete - это переменная с каким-то значением?

Vishal Raghavan 04.10.2018 09:51

Объекты dict могут содержать любой произвольный объект Python в качестве значения, которое может реализовывать любое представление при печати. Таким образом, это, безусловно, может быть действительный питон dict, однако delete не является объектом str.

juanpa.arrivillaga 04.10.2018 09:56

В этом случае delete был ключом, а не ценностью.

Mazimer 04.10.2018 15:01
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
327
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это действительный диктат Python. delete - это просто объект, определенный здесь: https://github.com/ZoomerAnalytics/jsondiff/blob/master/jsondiff/symbols.py#L14

Ответ принят как подходящий

В строке 6 файла jsondiff.__init__.py:

from .symbols import *

Обратите внимание, что не рекомендуется импортировать весь модуль с помощью символа splat, так как это затрудняет чтение кода среди других причин.

В .symbolsdelete определяется в строке 14:

delete = Symbol('delete')

а сам класс Symbol определен в строке 2 того же модуля.

class Symbol(object):
    def __init__(self, label):
        self.label = label

    def __repr__(self):
        return self.label

    def __str__(self):
        return "$" + self.label

Если бы вам нужно было создать словарь с переменной, например b, это будет выглядеть примерно так:

b = 'two'
d = {'one': 1, b: 2}
>>> d
{'one': 1, 'two': 2}

Однако, если бы вы использовали простой класс, он бы выглядел так:

class Sym(object):
    def __init__(self, label):
        self.label = label

b = Sym('test')
d = {'one': 1, b: 2}
>>> d
{<__main__.Sym at 0x1a194be240>: 2, 'one': 1}

Добавление метода dunder __repr__ сделает это более читаемым:

class Sym(object):
    def __init__(self, label):
        self.label = label

    def __repr__(self):
        return self.label

b = Sym('test')
d = {'one': 1, b: 2}
>>> d
{'one': 1, test: 2}

И последний метод __str__ добавляет к этикетке символ доллара при преобразовании в строку (например, при печати).

class Sym(object):
    def __init__(self, label):
        self.label = label

    def __repr__(self):
        return self.label

    def __str__(self):
        return "$" + self.label

b = Sym('test')
d = {'one': 1, b: 2}
>>> d
{test: 2, 'one': 1}

for key in d.keys():
    print(key)
# Output:
# $test
# one

полезно ли это вообще помимо использования объектов в качестве ключей? Я не могу представить себе вариант использования, в котором возврат такого словаря полезен, поскольку определения не сохраняются ... (tnx для пояснения, хотя я не понимал, что объекты могут использоваться в качестве ключей, я всегда предполагал, что это были только строки)

Mazimer 04.10.2018 10:38

«Полезное» - в глазах смотрящего. Я бы, наверное, не реализовал это так, как они, но, возможно, для этого есть причина.

Alexander 04.10.2018 10:42

Другие вопросы по теме