2013-08-28 11 views
18

mam to oświadczenie jako kilku linii:Python: Błąd wcięcia Pep8 E128 ... jak to zrobić w stylu?

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

W obecnej formie, przy użyciu skryptu PEP8, to daje mi „E128: linia kontynuacji pod wcięte dla wcięcia wizualne” błąd w drugim wierszu.

Próbowałem całą masę różnych sposobów formatowania, a jedynym sposobem mogę przestać PEP8 skarży się:

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

Ale to wygląda jak śmieci.

Sugestie? E124, E126 i E128 wydają się być ogromnym bólem!

Nie przeszkadza rozwiązań, które mają { na pierwszej linii (lub na jego własne), ale mam nadzieję, że to rozwiązanie, gdzie }, i context_instance... są na tym samym poziomie wcięcia.

+0

Czy istnieje powód, trzeba to wszystko za jeden rachunek z jednym gigantycznym wypowiedzi ?Dzielenie go nie sprawi, że już dłużej, i to oznacza, że ​​nie masz nawet żadnych skomplikowanych reguł stylu, aby się martwić, i prawdopodobnie będzie bardziej czytelny i bardziej debuggable do rozruchu. – abarnert

Odpowiedz

20

Problemem jest to, że wszystkie parametry mają być wcięte na tym samym poziomie. Obejmuje to dowolny parametr (y) na początkowej linii wywołania funkcji.

więc podczas mógłby naprawić to tak:

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

... że będzie zwykle tylko Ci uciekać konflikt z reguły 80-kolumnowej, i na pewno uczynić swój kod brzydsze nawet jeśli pep8 nie narzeka. Co prawdopodobnie chcesz to:

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

Albo, oczywiście, można po prostu zerwać swój olbrzymi wyrażenie:

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

Dziękuję za dokładną odpowiedź i wyjaśnienie. Ma pełny sens. – Joseph

4

Jestem pewien, że chce, aby wciąć wszystko parens otwarcia (jeśli trzeba parametr tam) - czyli

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

inaczej,

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

powinny być również prawny.

Lub niektóre takie. Zobacz pep docs na właściwych praktyk wcięć

Oto odpowiednie przykłady z specyfikacją, na przejeżdżającego wędrowca:

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

Nie chce, abyś wciskał wszystko w pareny otwierające. Gdyby to było prawdą, drugi nie działałby. To po prostu chce, abyś wciskał wszystkie parametry na tym samym poziomie, co wyjaśniłem w mojej odpowiedzi. – abarnert

+0

@abarnert Miałem na myśli w jego konkretnej sprawie - jego pierwszy parametr był na "parens otwarcia". Jeśli chce mieć tam argument, musi zostać wyrównany z ogranicznikiem początkowym. jak na pep 8: – vroomfondel

+0

"Linie kontynuacji powinny wyrównywać elementy zawijane w pionie przy użyciu niejawnej linii Pythona łączącej nawiasy, nawiasy klamrowe lub nawiasy klamrowe lub używając wcięcia wiszącego. Używając wcięcia wiszącego należy zastosować następujące rozważania: nie powinno być żadnych argumentów w pierwszym wierszu i dalszych wcięć należy użyć, aby wyraźnie odróżnić się od linii ciągłej. " – vroomfondel

4

Czy kiedykolwiek próbowałeś z django-annoying?

można to zrobić ...

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

myślę, że to jest czystsze i może pomóc w stylu PEP8 ...

+0

Nie, ale to wygląda świetnie. Dzięki za wskazówkę! – Joseph