Metoda łańcuchowa wywołuje styl wcięć w Pythonie [duplikat]

to pytanie ma już odpowiedzi tutaj : Jak złamać linię łańcuchowych metod w Pythonie? (8 odpowiedzi) Zamknięty 7 lat temu .

Z czytania PEP-8, rozumiem, że powinieneś umieścić nawias zamykający w tej samej linii, co ostatni argument w wywołaniach funkcji:

ShortName.objects.distinct().filter(
    product__photo__stockitem__isnull=False)

Prawdopodobnie najlepiej unikać długich wyrażeń. Ale jeśli jest to niepożądane, Jak można przejść przez wiele łańcuchowych wywołań metod? Czy zamykający paren powinien być na nowej linii?

ShortName.objects.distinct().filter(
    product__photo__stockitem__isnull=False
).values_list('value', flat=True)

A co z metodami bez argumentów? Jak pisać je na wielu linijkach bez odwoływania się do pośrednich wartości zwrotnych?

ShortName.objects.distinct(
    ).filter().values() # looks ugly

Update : istnieje zduplikowane pytanie Jak złamać linię łańcuchowych metod w Pythonie?. Odpowiedź sugeruje znajomy z jQuery styl rozpoczynania każdej nowej linii kropką. Autor nie podaje żadnych powodów ani autorytatywnych odniesień, więc chciałbym uzyskać potwierdzenie takiego stylu lub alternatywy.

Author: Community, 2011-12-30

2 answers

Jest to przypadek, w którym zamiast otwartych nawiasów preferowany jest znak kontynuacji linii.

ShortName.objects.distinct() \
         .filter().values()      # looks better

Potrzeba tego stylu staje się bardziej oczywista, gdy nazwy metod stają się dłuższe i gdy metody zaczynają przyjmować argumenty:

return some_collection.get_objects(locator=l5) \
                      .get_distinct(case_insensitive=True) \
                      .filter(predicate=query(q5)) \
                      .values()

PEP 8 ma być interpretowany z miarą zdrowego rozsądku i okiem zarówno na to, co praktyczne, jak i piękne. Szczęśliwie naruszają wszelkie wytyczne PEP 8, które skutkują brzydkim lub trudnym do odczytania kodem.

To powiedziawszy, jeśli często znajdujesz się w przeciwieństwie do PEP 8, może to być znak, że istnieją problemy z czytelnością, które wykraczają poza twój wybór białych znaków: -)
 198
Author: Raymond Hettinger,
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
2012-01-06 05:56:43

Myślę, że najlepiej jest użyć (), aby wymusić połączenie linii i zrobić to:

(ShortName.objects.distinct() # Look ma!
 .filter(product__photo__stickitem__isnull=False) # Comments are allowed
 .values_list('value', flat=True))
Nie jest idealny, ale podoba mi się, że wyróżnia się wizualnie i sprawia, że jest nieco oczywiste, czym jest łańcuch połączeń. Pozwala na komentarze końca linii, których \ newline nie ma.
 74
Author: Flimm,
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
2017-01-19 11:45:49