Как удалить пару ключ / значение из дампа 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__ , потому что это может быть трудно отличить от сериализованного объекта.

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

  • Отключить преобразование значения PyYAML
  • Использование python для сброса hexidecimals в YAML
  • Преобразование CSV в YAML, с Unicode?
  • Получение ученого представления данных из неконтролируемого обучения в pylearn2
  • Python и PYAML - yaml.scanner.ScannerError: значения отображения здесь не допускаются
  • Почему фатальная ошибка: файл yaml.h не найден при установке PyYAML?
  • Преобразование YAML в JSON с помощью Python: <block end> ​​найдено
  • Добавление комментариев к YAML, созданных с помощью PyYaml
  • Как я могу записать данные в формате YAML в файле?
  • Сохранить SQL в YAML как есть
  • Загрузка документа в качестве исходной строки в yaml с помощью PyYAML
  •  
    Interesting Posts for Van-Lav

    Чтение нескольких номеров из текстового файла

    Каково имя этого оператора «_» в Python?

    Лучший способ конвертировать URL-адрес Unicode в ASCII (UTF-8-escaped) в Python?

    Опция SSH для таймаута через короткое время? ClientAlive & ConnectTimeout, похоже, не делают то, что мне нужно от них.

    Есть ли хороший учебник по настройке механизма подсчета очков Augustus PMML в качестве веб-сервиса?

    Размер GUI Tkinter на экранах с высоким разрешением

    Использование дополнительных аргументов командной строки с помощью пушки

    когда нужно добавить предложение `else` в try..except в Python?

    python: Как получить имена столбцов из dataframe pandas – но только для непрерывного типа данных?

    Получение первой строки из sqlalchemy

    Загружать данные из txt с помощью pandas

    Scikit-Learn: метка не x присутствует во всех примерах обучения

    Эквивалент Python функции существования () Scala?

    обновление модуля python в коде

    Получение длины массива в Python

    Python - лучший язык программирования в мире.