Рубрики
Без рубрики

Питон за пределами PEP8

Вещи, которые PEP8 могли бы добиться большего. Tagged с помощью Python, Style, руководящих принципов.

Если вы пишете Python и не знаете, что PEP8 Идите и проверьте это Теперь Анкет

PEP8 – руководство по стилю для кода Python, и я думаю, что это довольно хорошо И я очень поощряю людей поставить статический анализатор Linter + в качестве первого шага перед проведением тестов в системах CI/CD в качестве теста на дым и сохранить вещи в виде аккуратных (на микроуровне я не говорю об архитектуре здесь).

Но этой направляющей линии не хватает в некоторых местах, где она способствует хрупким стилям и может быть улучшена:

Это стиль, который приемлем от PEP8, но он хрупкий.

# Aligned with opening delimiter.
foo = long_function_name(var_one, var_two,
                         var_three, var_four=4)

Что -то хрупкое, когда это легко ломается, и довольно легко сломать это отступ, изменив имя Фу или же long_function_name и мгновенно это Параметры во второй строке будут выровнены.

# Aligned with opening delimiter.
foo = refactoring(var_one, var_two,
                         var_three, var_four=4)

Есть некоторые редакторы, которые будут исправлять это для вас автоматически, но не у всех их есть. Также иногда я нахожу заброшенный код, подобный этому, от кого -то, кому пришлось избежать здания в огне или что -то в этом роде.

И не очень приятно, когда длинные функциональные вызовы вместе смотрят что -то вроде:

# Aligned with opening delimiter.
foo = long_function_name(var_one, var_two,
                         var_three, var_four=4)
barf = another_long_function_name(var_one, var_two,
                                  var_three, var_four=4)

Где количество пробелов нерегулярно, даже когда семантически обе линии находятся на одном уровне. Просто визуально вводит в заблуждение.

Если мы только что перечислили параметры функции по одному на строку с запятыми с запятыми:

# Aligned with opening delimiter.
foo = long_function_name(
    var_one, 
    var_two,
    var_three, 
    var_four=4,
)

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

 # Aligned with opening delimiter.
 foo = long_function_name(
     var_one, 
     var_two,
-    var_three, 
     var_four=4,
+    another_var=5,
 )

Очень приятно и легко определить изменения, когда вы делаете сравнение бок о бок.

В Python, если линия слишком длинная, вы можете использовать \ продолжить в следующей строке. По моему личному вкусу это выглядит довольно уродливо, и вам всегда нужно помнить все эти перерывы в импорте, например:

from django.db.models.expressions import Case, Exists, Expression, \
    ExpressionList, ExpressionWrapper, F, Func, OuterRef, RowRange, Subquery, \
    Value, ValueRange, When, Window, WindowFrame

Если вам придется удалить или переименовать там вещи, длина отступления линий будет выглядеть смешной, и вам, возможно, придется обернуть весь текст и повторно аранж на все обратные снесения.

Так почему бы не использовать скобку в качестве механизма группировки, как в математике:

from django.db.models.expressions import (
    Case, Exists, Expression, ExpressionList, ExpressionWrapper, F, Func,
    OuterRef, RowRange, Subquery, Value, ValueRange, When, Window, WindowFrame,
)

Или также:

from django.db.models.expressions import (
    Case, 
    Exists, 
    Expression, 
    ExpressionList, 
    ExpressionWrapper,  
    F, 
    Func,
    OuterRef, 
    RowRange, 
    Subquery, 
    Value, 
    ValueRange, 
    When, 
    Window, 
    WindowFrame,
)

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

Когда звонит что -то слишком долго

posts = (
   Posts.objects
   .exclude(author=user)
   .filter(title__startswith='hellow')
   .first()
)

При долгом Если :

if (not previous_is_grouped
        and not prev.has_two_images
        and nextone
        and not nextone.has_two_images):
    do_evil_stuff()

Здесь мне не нравится перерыв в продолжении между первой строкой IF и остального Но это нормально.

Также при получении долгого понимания списка:

double_of_evens = [
    x * 2
    for x in range(100)
    if x % 2 == 0
] 

Линии для: отображения, итерации и фильтрации.

Общие руководящие принципы для языка и целого сообщества потрясающие, и мне это нравится. Но не будь слепы, если вы действительно думаете, что есть Реальная причина Чтобы сделать что -то, немного лучше сделать этот шаг.

Подумайте обо всех заброшенных кодексах людей, которые должны были бежать в зданиях в огне. Лол 😂.

Оригинал: “https://dev.to/edelvalle/python-beyond-pep8-16g6”