#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 способа решить эту проблему:
- Отдельная
nav_files
подготовка и использование некоторыхfor
блоков - Разделите
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
becomesd.e
? Существуют ли какие-либо пути, замкнутые более чем на два элемента (после обрезки базы), как в/a
becoming justa
?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
]