Как удалить пару ключ / значение из дампа yaml в Python?

Предположим, у меня есть наивное определение класса:

import yaml class A: def __init__(self): self.abc = 1 self.hidden = 100 self.xyz = 2 def __repr__(self): return yaml.dump(self) A() 

печать

 !!python/object:__main__.A abc: 1 hidden: 100 xyz: 2 

Есть ли чистый способ удалить строку, содержащую hidden: 100 из выходного документа yaml dump? Указанное имя ключа известно заранее, но его числовое значение может измениться.

Желаемый результат:

 !!python/object:__main__.A abc: 1 xyz: 2 

FYI: этот дамп предназначен только для отображения и не будет загружен.

Я предполагаю, что можно подавить пару ключ / значение с ключом = hidden с использованием yaml.representative . Другой способ найти hidden: [number] с RegEx в строке вывода.

2 Solutions collect form web for “Как удалить пару ключ / значение из дампа yaml в Python?”

Я посмотрел документацию на pyyaml ​​и не нашел способ достичь вашей цели. Обход должен был бы удалить hidden атрибут, вызвать yaml.dump , а затем добавить его обратно:

  def __repr__(self): hidden = self.hidden del self.hidden return yaml.dump(self) self.hidden = hidden 

Сделав шаг назад, почему вы хотите использовать yaml для __repr__ ? Можете ли вы просто бросить свои собственные, а не полагаться на yaml ?

json является зрелым решением и (на момент написания) имеет гораздо лучшие документы, чем pyyaml ;
Я бы использовал его, а документы pyyaml трудно понять. В качестве бонуса YAML является (почти) надмножеством JSON, поэтому вы сможете читать свои данные как YAML без его преобразования.
Однако, чтобы легко использовать все преимущества YAML, вам, вероятно, придется преобразовать данные в YAML

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

 import json def default(o): if isinstance(o, A): result = vars(o).copy() del result['hidden'] result['__class__'] = o.__class__.__name__ return result else: return o json.dumps(A(), default=default) # => '{"__class__": "A", "xyz": 2, "abc": 1}' 

Если вы не хотите писать default=default всем мире, вы можете создать собственный сериализатор:

 dumper = json.JSONEncoder(default=default) dumper.encode(A()) # => '{"__class__": "A", "xyz": 2, "abc": 1}' 

Или, чтобы иметь возможность легко расширять его еще через подклассификацию:

 class Dumper(json.JSONEncoder): __slots__ = () def default(self, o): if isinstance(o, A): result = vars(o).copy() del result['hidden'] result['__class__'] = o.__class__.__name__ return result else: return super().default(o) dumper = Dumper() dumper.encode(A()) # => '{"__class__": "A", "xyz": 2, "abc": 1}' 

Обратите внимание, что поля в JSON неупорядочены.
Кроме того, если вы хотите использовать это, я бы посоветовал вам не сериализовать dict с ключом __class__ , потому что это может быть трудно отличить от сериализованного объекта.

Смотрите, как он работает в Интернете

  • Разбор YAML, возврат с номером строки
  • Python: доступ к значениям YAML с использованием «точечной нотации»
  • В чем заключается основное различие между pickle и yaml в Python?
  • Любые библиотеки yaml в Python, которые поддерживают демпинг длинных строк в виде блочных литералов или сложенных блоков?
  • Есть ли обновленный быстрый парсер YAML с привязками python?
  • словарь yaml multi вложен и словарь python
  • Могу ли я ускорить YAML?
  • Сохранить SQL в YAML как есть
  • Python - лучший язык программирования в мире.