Pythonic способ написания длинного оператора if в понимании списка

#python #python-3.x #if-statement

#python #python-3.x #if-statement

Вопрос:

Я новичок в python и надеюсь, что вы поможете мне найти способ правильно написать if оператор. Это код, который у меня есть:

 target_dir = Path(__file__).resolve().parents[1]
nav_files = [
    x
    for x in target_dir.rglob('conf.yaml')
    if '.'.join(str(x.parent).replace(str(target_dir), '').lstrip('/').split('/')[:2]) in settings.MODULES
]
  

Вы можете увидеть недопустимо длинное if утверждение. Насколько я понимаю, есть 2 способа решить эту проблему:

  1. Отдельная nav_files подготовка и использование некоторых for блоков
  2. Разделите if оператор на строки (если это возможно)

Какова наилучшая практика? Спасибо!

Комментарии:

1. Можете ли вы уточнить, что должен делать оператор if? Похоже, это операция с путем к файлу (определение относительного пути к target_dir , удаление конечного каталога и использование последних двух элементов пути?) который, вероятно, может быть выражен короче.

2. Обратите внимание, что общий подход к вопросу «Как я могу сделать <thing> более читаемым внутри <краткого выражения>» — это «Не втискивать <thing> в <краткое выражение>». В частности, оператор цикла for и служебная функция для условия, вероятно, намного более удобочитаемы.

3. Проект @MisterMiyagi имеет модульную структуру (base_dir / module / submodule / other_files) и есть список МОДУЛЕЙ, в котором есть такие элементы, как «core.page». В этом if заявлении мне нужны conf.yaml файлы фильтра только из включенных модулей (существующих в списке МОДУЛЕЙ). В результате мне нужно подготовить строку module.submodule из path для сравнения со списком МОДУЛЕЙ

4. Итак, в основном вам нужны последние два элемента пути, разделенные точкой? Как в /a/b/c/d/e becomes d.e ? Существуют ли какие-либо пути, замкнутые более чем на два элемента (после обрезки базы), как в /a becoming just a ?

5. @MisterMiyagi, насколько я вижу, модули состоят из 2 частей «модуль / подмодуль», нет просто «статического», есть «static.page», «static.widget» и т. Д

Ответ №1:

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

 nav_files = [
    x for x in target_dir.rglob('conf.yaml')
    if '.'.join(
        str(x.parent).replace(
            str(target_dir), '').lstrip(
            '/').split('/')[:2]) in settings.MODULES
]