Тупая ошибкаPython

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

Хочу сделать на коленке простейшую заглушку на питоне, которая читает файл конфигурации в JSON формате, меняет пару ключей, и записывает обратно. Нужно для быстрого восстановления конфигурации (только избранных ключей) при полном удалении и переустановке в коллабе пакета AUTOMATIC1111 StableDiffusion (что последнее время стало требоваться частенько). Сам я на Питоне практически ни бум-бум, но методом копипасты и выбрасывания лишнего собрал вот такого уродца, и на 90% он работает, кроме самого важного - не читается собственно JSON.

Друзья, огромная, человеческая просьба: не нужно мне рассказывать, что лично вы уже 10 лет работаете в SD и ни единого разрыва ни разу его переставляли; что проще не мучить коллаб, а купить за 100500 денег крутую видяху и поставить SD локально; что вы пользуетесь другой сборкой, и у вас все хорошо и т.д. и т.п. По ряду причин мне подходит именно так; за то, что у вас все по--другому круто получается - заочно рад, но читать об этом интереса не имею.

Кусок кода (там, где "погрызено" - функции, которые не используются и не влияют на чтение; отступы маленько засрались). save_txt в JSONе равен True.

import json

import os

data_path=('/content/gdrive/MyDrive/sd/stable-diffusion-webui')

config_filename = os.path.join(data_path, 'config.json')

config_path = os.path.dirname(config_filename)

assert os.path.exists(config_path), "Config path not exist!"

assert os.path.isfile(config_filename), "Config file not exist!"

print(config_filename)

class OptionInfo:

def __init__(self, default=None, label="", component=None, component_args=None, onchange=None, section=None, refresh=None):

self.default = default

self.label = label

self.component = component

self.component_args = component_args

self.onchange = onchange

self.section = section

self.refresh = refresh

def options_section(section_identifier, options_dict):

for k, v in options_dict.items():

v.section = section_identifier

return options_dict

options_templates = {}

options_templates.update(options_section(('saving-images', "Saving images/grids"), {

"save_txt": OptionInfo(False, "Create a text file next to every image with generation parameters."),

}))

options_templates.update()

print(options_templates.items());

class Options:

data = {}

data_labels = options_templates

typemap = {int: float}

def __init__(self):

""" self.data = {k: v.default for k, v in self.data_labels.items()} """

for k, v in self.data_labels.items():

self.data.setdefault(k, v.default)

print("self.data.items()")

print(self.data.items())

def __getattr__(self, item):

if self.data is not None:

if item in self.data:

return self.data[item]


if item in self.data_labels:

return self.data_labels[item].default
return False

... погрызено ...


def load(self, filename):

print(filename)

with open(filename, "r", encoding="utf8") as file:

self.data = json.load(file)


print("self.data.items() after json.load(file)") 

print(self.data.items())

... погрызено ...

opts = Options()

if os.path.exists(config_filename):

opts.load(config_filename)

print(opts.save_txt)

И вывод (переводы строки добавлены для ясности):

/content/gdrive/MyDrive/sd/stable-diffusion-webui/config.json

dict_items([('save_txt', <__main__.OptionInfo object at 0x7f7cb44ee6a0>)])

self.data.items()

dict_items([('save_txt', False)])

/content/gdrive/MyDrive/sd/stable-diffusion-webui/config.json

self.data.items() after json.load(file)

dict_items([('save_txt', False)])

False

Примечания.

1) Закомментированная строчка

self.data = {k: v.default for k, v in self.data_labels.items()}

по какой-то причине не делает в моем коде ничего; хотя в оригинальном, очевидно, работает.

2) Также в оригинале стоит не data = {}, а data = None - но у меня что-то так тоже не отработало, эмпирически решил инициализировать как пустой dict.

3) Да, не все лишнее выковыряно, в частности - не нужные вне ВЕБ-интерфейса секции, но причина вряд ли в этом.

4) Первая мысль проверить, что читается что-то не то - но файл /content/gdrive/MyDrive/sd/stable-diffusion-webui/config.json 100% существует, и содержит много ключиков; выставленные в начале ассерты тоже проходятся бз ошибок.

5) Но на выходе после self.data = json.load(file) получаем то же самое, что на входе.

6) Если не инициализировать self.data в _init__(self), то на выходе после json.load(file) будет просто пусто и выдастся ошибка.

Какая может быть причина такой печали, что еще можно покрутить? Фантазии уже нет.

Правила сообщества

Публиковать могут пользователи с любым рейтингом. Однако!


Приветствуется:

• уважение к читателям и авторам

• конструктивность комментариев

• простота и информативность повествования

• тег python2 или python3, если актуально

• код публиковать в виде цитаты, либо ссылкой на специализированный сайт


Не рекомендуется:

• допускать оскорбления и провокации

• распространять вредоносное ПО

• просить решить вашу полноценную задачу за вас

• нарушать правила Пикабу