Style d’indentation d’appels en méthode chaînée en Python

En lisant PEP-8, je comprends que vous devez placer la parenthèse fermante sur la même ligne que le dernier argument des appels de fonction:

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

Les expressions longues sont probablement à éviter. Mais si cela n’est pas souhaitable, comment feriez-vous pour les appels de méthode à chaînes multiples? Le paren de fermeture devrait-il être sur une nouvelle ligne?

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

Qu’en est-il des méthodes sans arguments? Comment les écrire sur plusieurs lignes sans référencer les valeurs de retour intermédiaires?

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

Mise à jour : Il y a une question en double sur Comment casser une ligne de méthodes en chaîne en Python? . La réponse acceptée suggère un style familier du style jQuery pour démarrer chaque nouvelle ligne avec un point. L’auteur ne fournit aucune raison ou référence faisant autorité, alors j’aimerais avoir une confirmation sur un tel style ou une alternative.

C’est un cas où un caractère de continuation de ligne est préféré pour ouvrir des parenthèses.

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

Le besoin de ce style devient plus évident à mesure que les noms de méthode s’allongent et que les méthodes commencent à prendre des arguments:

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

Le PEP 8 est destiné à être interprété avec une mesure de bon sens et un oeil pour le pratique et le beau. Viole heureusement toute directive PEP 8 qui se traduit par du code laid ou difficile à lire.

Cela étant dit, si vous vous trouvez souvent en conflit avec PEP 8, cela peut être un signe qu’il existe des problèmes de lisibilité qui transcendent votre choix d’espaces blancs 🙂

Je pense que le mieux est d’utiliser () pour forcer la jonction de lignes, et pour ce faire:

 (ShortName.objects.distinct() # Look ma! .filter(product__photo__stickitem__isnull=False) # Comments are allowed .values_list('value', flat=True)) 

Ce n’est pas idéal, mais j’aime le fait qu’il se distingue visuellement et que la chaîne d’appels est quelque peu évidente. Il autorise les commentaires de fin de ligne, ce que \ newline ne fait pas.