2013-04-17 11 views
23

Wie formatiert man eine lange Behauptung, die PEP8 entspricht? Bitte ignoriere die erfundene Natur meines Beispiels.Wie formatiert man eine Python-Asser-Anweisung, die mit PEP8 übereinstimmt?

def afunc(some_param_name): 
    assert isinstance(some_param_name, SomeClassName), 'some_param_name must be an instance of SomeClassName, silly goose!' 

Man kann nicht wickeln Sie es in Klammern, denn das ist das Verhalten der assert-Anweisung ändert, da es ein Schlüsselwort ist, nicht eine eingebaute Funktion.

+0

'assert' sollte wirklich nur für ** Debuggen verwendet werden ** Zweck, jede andere Verwendung ist Missbrauch der' assert' Funktionalität. Alle 'Assert's werden auch entfernt, wenn Python mit der Option' -O' ausgeführt wird. – Wessie

+4

@Wessie Ich sehe nicht, wie das relevant ist. –

Antwort

39

Es ist wichtig zu beachten, dass PEP8 nur eine Richtlinie und even states that there are times when the rules should be broken ist.

Aber am wichtigsten: wissen, wann inkonsistent sein soll - manchmal gilt der Styleguide einfach nicht.

Mit dem im Verstand, würde ich wahrscheinlich dieses mit alter Fortsetzung Artlinie schreiben:

def afunc(some_param_name): 
    assert isinstance(some_param_name, SomeClassName), \ 
      'some_param_name must be an instance of SomeClassName, silly goose!' 

Wenn das nicht gut mit Ihnen nicht sitzen (oder Ihren Linter), können Sie immer tun:

def afunc(some_param_name): 
    assert isinstance(some_param_name, SomeClassName), ( 
      'some_param_name must be an instance of SomeClassName, silly goose!') 

oder sogar:

def afunc(some_param_name): 
    assert isinstance(some_param_name, SomeClassName), ( 
      'some_param_name must be an instance of SomeClassName, ' 
      'silly goose!') 
+1

+1. Ich würde argumentieren, dass dies die besser lesbare Lösung ist. Bracket-Fortsetzungen sind * bevorzugt * über Backslash Line-Fortsetzungen, aber das ist eine allgemeine Aussage, und einzelne Fälle variieren. –

+0

+1 für "Regeln sollten gebrochen werden". Ich neige dazu, die Zeilenfortsetzung im alten Stil zu verwenden, und sei es nur, weil es die Lösung ist, die zum Schreiben die wenigsten Tastenanschläge benötigt. Das ist auch einer der Gründe, warum ich Python gegenüber PHP bevorzuge: 'def 'ist kürzer als' function'. Es gibt natürlich viel überzeugendere Gründe. ;-) – Aya

+0

Super, danke. Stimme voll und ganz zu, dass PEP8 eine Richtlinie ist. Wir verwenden flake8 (das pyflakes und pep8.py kombiniert), und ich dachte, dass es etwas gibt, das den Geist von PEP8 und Linters befriedigen würde. – stantonk

4
ERR_MESSAGE_01 = ''' 
Some really long error message 
''' 

assert condition(a,b), ERR_MESSAGE_01 

ist, wie ich es tun ... und ich denke, dass erfüllt fein ..

+1

Wenn der Beitrag über PEP-8-Konformität spricht, helfen die 'CAPS_WITH_UNDERSCORES' Namen nicht. –

+0

ja fairer Punkt ... Übertrag von C# defines und Konstanten. zweifelhaft ... aber ich bleibe dran.Außerdem denke ich daran als eine Modul-Level-Konstante, die pep8 uns anweist, so zu benennen –

+3

Konstanten: Konstanten werden normalerweise auf einer Modulebene definiert und in Großbuchstaben mit Unterstrichen geschrieben, die Wörter trennen. Beispiele umfassen MAX_OVERFLOW und TOTAL. –

3

Es ist erwähnenswert, dass es möglich ist, mit Klammern zu wickeln, nur nicht in der Art und Weise Sie denken.

assert isinstance(some_param_name, 
        SomeClassName), ('some_param_name must be an instance of ' 
            'SomeClassName, silly goose!') 

Ich würde nicht argumentieren, es ist aber besonders lesbar. In einigen Fällen könnte es die richtige Option sein.

1
def afunc(some_param_name): 
    assert (isinstance(some_param_name, SomeClassName) 
      ), 'some_param_name must be an instance of SomeClassName, silly goose!' 

Dies gibt Ihnen die implizierte Zeilenfortsetzung in Klammern, die von PEP 8 empfohlen wird, ohne das assert-Verhalten zu unterbrechen.

Alternativ:

def afunc(some_param_name): 
    assert isinstance(some_param_name, SomeClassName), (
      'some_param_name must be an instance of SomeClassName, silly goose!')