2013-08-28 7 views
18

Ich habe diese Aussage als ein paar Zeilen:Python: Pep8 E128 Einrückungsfehler ... wie kann das durch gestylt werden?

return render_to_response('foo/page.html', 
     { 
      'situations': situations, 
      'active': active_req, 
     }, 
     context_instance=RequestContext(request)) 

Wie es aussieht, das PEP8 Skript, es gibt mir eine „E128: Fortsetzung Linie unter gegliederter zum visuellen indent“ Fehler in der zweiten Zeile.

Ich habe eine ganze Reihe von verschiedenen Möglichkeiten der Formatierung versucht, und der einzige Weg, ich PEP8 bekommen beschweren zu stoppen ist:

return render_to_response('foo/page.html', { 
     'situations': situations, 
     'active': active_req, 
    }, 
     context_instance=RequestContext(request)) 

Aber das sieht aus wie Müll.

Vorschläge? E124, E126 und E128 scheinen ein großer Schmerz zu sein!

ich nichts dagegen haben keine Lösungen, die die { in der ersten Zeile (oder auf seine eigene), aber ich hoffe, es gibt eine Lösung, bei der die }, und context_instance... auf der gleichen Einrückungsebene sind.

+0

Gibt es einen Grund, warum Sie diese brauchen, um alles mit einem riesigen Ausdruck eine Anweisung sein ?Wenn du es aufteilst, wird es nicht länger dauern, und es bedeutet, dass du nicht einmal komplizierte Stilregeln hast, um die du dich sorgen musst, und es wird wahrscheinlich lesbarer und besser debuggbar sein, um es zu booten. – abarnert

Antwort

20

Das Problem ist, dass alle Parameter sollen eingerückt sein auf das gleiche Niveau. Dazu gehören alle Parameter in der ersten Funktionsaufrufzeile.

So, während Sie es wie dieses Problem beheben könnte:

return render_to_response('foo/page.html', 
          { 
           'situations': situations, 
           'active': active_req, 
          }, 
          context_instance=RequestContext(request)) 

... das wird in der Regel nur Sie afoul der 80-Spalten-Regel laufen zu lassen, und wird sicherlich Ihren Code machen hässlicher auch wenn pep8 beklagt sich nicht. Was Sie wahrscheinlich wollen, ist dies:

return render_to_response(
    'foo/page.html', 
    { 
     'situations': situations, 
     'active': active_req, 
    }, 
    context_instance=RequestContext(request)) 

Oder natürlich, könnten Sie einfach brechen Ihre riesigen Ausdruck up:

d = { 
    'situations': situations, 
    'active': active_req, 
} 
context = RequestContext(request) 
return render_to_response('foo/page.html', d, context_instance=context) 
+0

Danke für Ihre gründliche Antwort und Erklärung. Macht Sinn. – Joseph

4

Ich bin mir ziemlich sicher, dass es möchte, dass Sie alles auf die Öffnung Pars einrücken (wenn Sie einen Parameter dort oben brauchen) - also

return render_to_response('foo/page.html', 
          { 
           'situations': situations, 
           'active': active_req, 
          }, 
          context_instance=RequestContext(request)) 

sonst

return render_to_response(
    'foo/page.html', 
    { 
     'situations': situations, 
     'active': active_req, 
    }, 
    context_instance=RequestContext(request)) 

sollte auch legal.

Oder einige solche. Siehe die pep docs auf dem richtigen Vertiefung Praktiken

Hier sind die entsprechenden Beispiele aus der Spezifikation für einen vorübergehenden Wanderer:

Yes: 

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

# More indentation included to distinguish this from the rest. 
def long_function_name(
     var_one, var_two, var_three, 
     var_four): 
    print(var_one) 
No: 

# Arguments on first line forbidden when not using vertical alignment 
foo = long_function_name(var_one, var_two, 
    var_three, var_four) 

# Further indentation required as indentation is not distinguishable 
def long_function_name(
    var_one, var_two, var_three, 
    var_four): 
    print(var_one) 
Optional: 

# Extra indentation is not necessary. 
foo = long_function_name(
    var_one, var_two, 
    var_three, var_four) 
+0

Es will nicht, dass Sie alles zu den Anfangsparens einrücken. Wenn das wahr wäre, würde der zweite nicht funktionieren. Es möchte nur, dass Sie alle Parameter auf das gleiche Niveau einrücken, wie ich in meiner Antwort erklärt habe. – abarnert

+0

@abarnert Ich meinte in seinem speziellen Fall - sein erster Parameter war bei der "Eröffnung Parens." Wenn er ein Argument oben haben will, muss es mit dem Startbegrenzer ausgerichtet werden. gemäß pep 8: – vroomfondel

+0

"Fortsetzungszeilen sollten umwickelte Elemente entweder vertikal ausrichten, indem Pythons implizite Linie innerhalb von Klammern, Klammern und geschweiften Klammern verwendet wird, oder einen hängenden Einzug verwenden. Bei Verwendung eines hängenden Einzüge sollten die folgenden Überlegungen gelten; es sollte keine Argumente geben in der ersten Zeile und der weiteren Einrückung sollte man sich klar als Fortsetzungszeile auszeichnen. " – vroomfondel

4

Haben Sie jemals versucht mit django-annoying?

Sie dies tun können ...

@render_to('foo/page.html') 
def bar(request): 
    return {'situations': situations, 
      'active': active_req,} 

Ich denke, das ist sauberer und es können Sie mit dem PEP8 Stil helfen ...

+0

habe ich nicht, aber das sieht toll aus. Danke für den Tipp! – Joseph