Я использую библиотеку 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, извините, если этот вопрос кажется ленивым.
редактировать:
a=jsondiff.diff(json1,json2,load=True)Объекты dict могут содержать любой произвольный объект Python в качестве значения, которое может реализовывать любое представление при печати. Таким образом, это, безусловно, может быть действительный питон dict, однако delete не является объектом str.
В этом случае delete был ключом, а не ценностью.






Это действительный диктат 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 для пояснения, хотя я не понимал, что объекты могут использоваться в качестве ключей, я всегда предполагал, что это были только строки)
«Полезное» - в глазах смотрящего. Я бы, наверное, не реализовал это так, как они, но, возможно, для этого есть причина.
Может быть, delete - это переменная с каким-то значением?