Отключить черное форматирование выражения dict в рамках сопоставления

В настоящее время я исследую Black как средство форматирования по умолчанию, но у меня есть некоторые крайние случаи, которые плохо форматируются, и я хочу знать, есть ли способ получить желаемый результат.

Документация Блэка частично исследует мою проблему, у меня есть словарное выражение, распределенное по горизонтали, и я хочу оставить его таким, поскольку я ожидаю добавления строк, например:

# Black would keep this as-is because of the trailing comma
TRANSLATIONS = {
    "en_us": "English (US)",
    "pl_pl": "polski",
}

Но в моем случае словарь находится внутри понимания списка:

res = [
    {
        'id': item.id,
        'name': item.name,
    }
    for item in items.select()
]

Какой черный коллапсирует, вне зависимости от конечной запятой, вот так:

res = [
    {"id": item.id, "name": item.name,}
    for item in items.select()
]

Есть ли способ сказать черным в таких случаях сохранить горизонтальную структуру?

2 ответа

Решение

Похоже, черный решал эту проблему.

На момент написания этого ответа использовалась черная версия 20.8b1, форматирование выполнено, как я и надеялся.

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

      res = [
    {
        "id": item.id, "name": item.name,
    }
    for item in items.select()
]

Будет отформатирован в:

      res = [
    {
        "id": item.id,
        "name": item.name,
    }
    for item in items.select()
]

Вы можете использовать # fmt: off / # fmt: on характерная черта.

Как вы можете видеть ниже:

  • Составление списка перед # fmt: off был отформатирован черным
  • Между # fmt: off / # fmt: on понимание списка не было отформатировано черным
  • Понимание списка после # fmt: on был отформатирован черным

Код (после форматирования Черным):

res1 = [{"id": item[0], "name": item[1],} for item in [[5, "foo"], [6, "bar"]]]

# fmt: off
res2 = [
    {
        'id': item[0],
        'name': item[1],
    }
    for item in [[7, "fooo"], [8, "barr"]]
]
# fmt: on

res3 = [{"id": item[0], "name": item[1],} for item in [[9, "fooo0"], [10, "barrr"]]]

print(res1)
print(res2)
print(res3)

Вывод Python balck:

/home/milanbalazs/.local/bin/black --fast -l 100 -v /home/milanbalazs/test.py
reformatted /home/milanbalazs/test.py
All done! ✨  ✨
1 file reformatted.

Вывод кода:

>>> python3 test.py 
[{'id': 5, 'name': 'foo'}, {'id': 6, 'name': 'bar'}]
[{'id': 7, 'name': 'fooo'}, {'id': 8, 'name': 'barr'}]
[{'id': 9, 'name': 'fooo0'}, {'id': 10, 'name': 'barrr'}]

Связанная часть документации Black: https://github.com/psf/black

Другие вопросы по тегам