Metoda łańcuchowa wywołuje styl wcięć w Pythonie [duplikat]
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.
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: -)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.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