Poprawny styl łamania linii podczas łączenia metod w Pythonie

Mam taki kod. Czy przerwa powinna nastąpić przed miesiączką czy po?

# before
my_var = somethinglikethis.where(we=do_things).where(we=domore).where(we=everdomore)

# this way
my_var = somethinglikethis.where(we=do_things) \
                          .where(we=domore) \
                          .where(we=everdomore)

# or this way
my_var = somethinglikethis.where(we=do_things). \
                           where(we=domore). \
                           where(we=everdomore)
Author: Mark Amery, 2011-10-30

5 answers

PEP 8 zaleca używanie nawiasów, aby nie było potrzeby \, i delikatnie sugeruje łamanie przed operatorami binarnymi zamiast po nich. Tak więc preferowany sposób formatowania kodu jest następujący:

my_var = (somethinglikethis
          .where(we=do_things)
          .where(we=domore)
          .where(we=everdomore))

Dwa istotne fragmenty to ten z Maksymalna długość linii sekcja:

Preferowanym sposobem owijania długich linii jest użycie implikowanej linii Pythona w nawiasach, nawiasach i nawiasach klamrowych. Długie linie mogą być łamane przez wiele linii przez zawijanie wyrażeń w nawiasy. Powinny one być używane zamiast odwrotnego ukośnika dla kontynuacji linii.

... a cały powinien przerwać wiersz przed czy po operatorze binarnym? sekcja:

Czy linia powinna pękać przed czy po operatorze binarnym?

Przez dziesięciolecia zalecanym stylem było zerwanie po operatorach binarnych. Ale może to zaszkodzić czytelności na dwa sposoby: operatorzy mają tendencję do rozproszone w różnych kolumnach na ekranie, a każdy operator jest odszedł od operandu i przeszedł na poprzednią linię. Tutaj, oko musi wykonać dodatkową pracę, aby stwierdzić, które elementy są dodawane, a które są odejmowane:

# No: operators sit far away from their operands
income = (gross_wages +
          taxable_interest +
          (dividends - qualified_dividends) -
          ira_deduction -
          student_loan_interest)

Aby rozwiązać ten problem czytelności, matematycy i ich wydawcy postępuj zgodnie z przeciwną konwencją. Donald Knuth wyjaśnia tradycyjne zasada w serii komputerów i składu : "chociaż formuły w obrębie akapitu zawsze przerwa po operacji binarnych i relacje, wyświetlane formuły zawsze pękają przed operacjami binarnymi "

Podążanie za tradycją z matematyki zwykle skutkuje bardziej czytelny kod:

# Yes: easy to match operators with operands
income = (gross_wages
          + taxable_interest
          + (dividends - qualified_dividends)
          - ira_deduction
          - student_loan_interest)

W kodzie Pythona dozwolone jest łamanie przed lub po binarnym operator, o ile konwencja jest spójna lokalnie. Dla nowych sugerowany jest styl kodu Knutha.

Zauważ, że, jak wskazano w powyższym cytacie, PEP 8 użył , aby dać przeciwną Radę o tym, gdzie złamać wokół operator, cytowany poniżej dla potomności:

Preferowanym sposobem owijania długich linii jest użycie domyślnej linii Pythona kontynuacja wewnątrz nawiasów, nawiasów i szelek. Długie linie mogą być łamane przez wiele linii przez zawijanie wyrażeń w nawiasy. Te powinien być używany zamiast odwrotnego ukośnika dla kontynuacji linii. Upewnij się, że kontynuowana linia jest odpowiednio wcięta. Preferowane miejsce złamanie wokół operatora binarnego to po {[7] } centrala, nie wcześniej. Niektóre przykłady:

class Rectangle(Blob):

    def __init__(self, width, height,
                 color='black', emphasis=None, highlight=0):
        if (width == 0 and height == 0 and
            color == 'red' and emphasis == 'strong' or
            highlight > 100):
            raise ValueError("sorry, you lose")
        if width == 0 and height == 0 and (color == 'red' or
                                           emphasis is None):
            raise ValueError("I don't think so -- values are %s, %s" %
                             (width, height))
        Blob.__init__(self, width, height,
                      color, emphasis, highlight)
 51
Author: Bastien Léonard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-07 20:39:23

PEP 8 mówi, że łamanie przed operatorem jest preferowane:

Donald Knuth wyjaśnia tradycyjną zasadę w swoich komputerach i seriach składowych: "chociaż formuły w akapicie zawsze pękają po operacjach binarnych i relacjach, wyświetlane formuły zawsze pękają przed operacjami binarnymi".

...

W kodzie Pythona dozwolone jest łamanie przed lub po operatorze binarnym, o ile konwencja jest spójna lokalnie. Dla nowego kodu Sugerowany jest styl Knutha.

Https://www.python.org/dev/peps/pep-0008/#should-a-line-break-before-or-after-a-binary-operator

 4
Author: Neapolitan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-09 11:54:42

FWIW, autopep8 (z flagą --aggressive) wyprodukował to z twojego oryginalnego kodu:

my_var = somethinglikethis.where(
    we=do_things).where(
    we=domore).where(
    we=everdomore)
Ale Zgadzam się -- rozwiązanie Bastiena jest bardziej eleganckie.
 2
Author: Amanda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-18 15:44:38

Rób to, co działa.

Sprawdź również ten dokument na temat mitów o wcięciach w Pythonie. Które można znaleźć proszę..

Zaczyna się od:

" białe znaki są znaczące w kodzie źródłowym Pythona."

Nie, Nie w ogóle. Tylko poziom wcięcia twoich wypowiedzi jest znacząca (np. Biała spacja po lewej stronie wypowiedzi). Wszędzie indziej białe znaki nie są znaczące i mogą być używane tak, jak ty jak w każdym innym języku. Można również wstawiać puste wiersze które nie zawierają nigdzie (lub tylko dowolne białe znaki).

Mam nadzieję, że to pomoże.

 1
Author: Mr_Spock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-30 00:39:50

Tam naprawdę nie ma żadnych złych sposobów. Wszystkie wymienione będą działać tak samo.

 -2
Author: D3_JMultiply,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-30 00:42:44