Как упростить манипулирование json-файлами в python

Моя компания очень строго придерживается пидокстиля. Я бегу к пределу строки, пытаясь изменить эти значения, вложенные в файл json.

    Rem_Conf['RemediationConfigurations'][0]['Parameters']['AutomationAssumeRole']['StaticValue']['Values'][0] = rolearn
    Rem_Conf['RemediationConfigurations'][0]['Parameters']['GranteeId']['StaticValue']['Values'][0] = canid
    Rem_Conf['RemediationConfigurations'][0]['Parameters']['TargetBucket']['StaticValue']['Values'][0] = targetbucket

Как я могу сжать это, чтобы соответствовать пределу пидокстиля в 79 символов?

Всего 4 ответа


Одним из способов является замена встроенных ключей с именованными переменными

cfg='RemediationConfigurations'
params='Parameters'
role='AutomationAssumeRole'
sval='StaticValue'
val='Values'
guid='GranteeId'
tbuk='TargetBucket'
Rem_Conf[cfg][0][params][role][sval][val][0] = rolearn
Rem_Conf[cfg][0][params][guid][sval][val][0] = canid
Rem_Conf[cfg][0][params][tbuk][sval][val][0] = targetbucket

Здесь самая длинная строка - 60 символов, и это делает читателя очень понятным


Вы можете заключить строки в скобки, как показано ниже. Конечно, не стесняйтесь поиграть с форматированием. Это то, что выводит black форматтер.

(
    Rem_Conf["RemediationConfigurations"][0]["Parameters"]["AutomationAssumeRole"][
        "StaticValue"
    ]["Values"][0]
) = rolearn
(
    Rem_Conf["RemediationConfigurations"][0]["Parameters"]["GranteeId"]["StaticValue"][
        "Values"
    ][0]
) = canid
(
    Rem_Conf["RemediationConfigurations"][0]["Parameters"]["TargetBucket"][
        "StaticValue"
    ]["Values"][0]
) = targetbucket

ИМХО, это был бы читаемый формат:

(Rem_Conf
    ["RemediationConfigurations"]
    [0]
    ["Parameters"]
    ["AutomationAssumeRole"]
    ["StaticValue"]
    ["Values"]
    [0]
) = rolearn

Вот что выводит форматер black питона на ваш оригинальный код:

Rem_Conf["RemediationConfigurations"][0]["Parameters"]["AutomationAssumeRole"][
    "StaticValue"
]["Values"][0] = rolearn
Rem_Conf["RemediationConfigurations"][0]["Parameters"]["GranteeId"]["StaticValue"][
    "Values"
][0] = canid
Rem_Conf["RemediationConfigurations"][0]["Parameters"]["TargetBucket"]["StaticValue"][
    "Values"
][0] = targetbucket

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

Rem_Conf['RemediationConfigurations'][0]['Parameters'] 
            ['AutomationAssumeRole']['StaticValue']['Values'][0] = rolearn
Rem_Conf['RemediationConfigurations'][0]['Parameters'] 
            ['GranteeId']['StaticValue']['Values'][0] = canid
Rem_Conf['RemediationConfigurations'][0]['Parameters'] 
            ['TargetBucket']['StaticValue']['Values'][0] = targetbucket

Документация Python гласит следующее:

2.1.5. Явное соединение строк

Две или более физических строки могут быть объединены в логические строки с помощью символов обратной косой черты ( ) следующим образом: когда физическая строка заканчивается обратной косой чертой, которая не является частью строкового литерала или комментария, она объединяется со следующими, образуя одну логическую строку строка, удаляя обратную косую черту и следующий символ конца строки.


Я бы просто использовал промежуточное значение:

Parameters = Rem_Conf['RemediationConfigurations'][0]['Parameters']
Parameters['AutomationAssumeRole']['StaticValue']['Values'][0] = rolearn
Parameters['GranteeId']['StaticValue']['Values'][0] = canid
Parameters['TargetBucket']['StaticValue']['Values'][0] = targetbucket

Есть идеи?

10000