Как записать в файл yaml в удобочитаемом формате? - PullRequest
0 голосов
/ 31 декабря 2018

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

a.Список массивов numpy, например, [ndarray, ndarray, ndarray] разных размеров.

b.Любой произвольный массив NumPy, например, np.zeros((5,6)), np.randn((76,2)) и т. Д.

c.Любые другие будущие типы данных, которые мне еще не приходили в голову.

Требования:

  1. Мне нужна одна функция, чтобы можно было сохранить всеэти типы данных, без специальной обработки и с будущей совместимостью для типа c, указанного выше.

  2. Мне также нужен дамп выходного файла в удобочитаемом формате.

До сих пор я смог выполнить требование 1 только с помощью YAML или pickle, оба из которых с двоичными файлами, т.е. не читаемыми человеком.

@staticmethod
def _read_with_yaml(path):
    with open(path, 'r') as stream:
        return yaml.load(stream)

@staticmethod
def _write_with_yaml(path, obj):
    with io.open(path, 'w+', encoding='utf8') as outfile:
        yaml.dump(obj, outfile, default_flow_style=False, allow_unicode=True)

В этом примере кода выводится не-человек-читаемые файлы, но работает для типов данных, которые у меня есть.

Есть ли способ выполнить оба требования?

1 Ответ

0 голосов
/ 31 декабря 2018

Нет, ваши требования не могут быть удовлетворены.

У вас уже есть одна функция yaml.dump(), которая сохраняет все эти типы данных.Как вы заметили, он не делает это в очень удобочитаемой форме для неповоротливых структур данных.Это вызвано тем, что numpy не имеет подпрограмм дампа для их специальной структуры данных, а вместо этого возвращается к не очень читаемому, помеченному по умолчанию !python.... помеченному дампу структуры данных.Теперь вы (или сопровождающие пакетов YAML или Numpy) можете предоставить специальные подпрограммы для тех объектов, которые создают дамп в более читаемом формате, чтобы его можно было охватить.Вы можете сделать представитель в своей библиотеке YAML более интеллектуальным и получить более читаемый вывод для структур данных Numpy, не затрагивая классы Numpy.

Но вы хотите это для всех будущих типов данных, а IMO - вариантПрименяется теорема Гёделя: даже если библиотека YAML расширена, чтобы охватить все известные случаи и вывести их в удобочитаемом виде, всегда будут новые структуры данных, особенно в расширениях на основе C (например, Numpy), которые нельзя представить в читаемом видепуть без лишней работы.

Так что из-за вашего

Любого другого будущего неизвестного типа данных, который мне еще не приходил в голову.

предпосылка, это не просто многотрудной работы, но невозможно.

...