2013-04-17 9 views
23

In che modo si formatta una dichiarazione di asserzione lunga conforme a PEP8? Si prega di ignorare la natura forzata del mio esempio. NonCome formattare un'istruzione di asserzione python conforme a PEP8?

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

si può avvolgerlo tra parentesi, perché cambia il comportamento del assert dal momento che è una parola chiave, non una funzione built-in.

+0

'assert' in realtà dovrebbe essere utilizzato solo per il debug ** ** scopo, ogni altro uso è l'abuso delle funzionalità' assert'. Tutti gli 'assert' vengono rimossi anche quando si esegue python con l'opzione' -O'. – Wessie

+4

@Wessie Non vedo come sia rilevante. –

risposta

39

È importante ricordare che PEP8 è solo una linea guida e even states that there are times when the rules should be broken.

Ma soprattutto: sapere quando essere incoerenti - a volte la guida allo stile non si applica.

Con questo in mente, probabilmente scrivere questo con la vecchia linea stile continuazione:

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

Se questo non sta bene con voi (o il vostro Linter), si può sempre fare:

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

o anche:

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

+1. Direi che questa è la soluzione più leggibile qui. Le continuazioni delle parentesi sono * preferite * su continuazioni di backslash line, ma questa è una dichiarazione generale e i casi individuali variano. –

+0

+1 per "le regole devono essere interrotte". Tendo ad usare la continuazione della linea vecchio stile, se non altro perché è la soluzione che richiede il minor numero di tasti da scrivere. Questo è anche uno dei motivi per cui preferisco Python a PHP: 'def' è più breve di' function'. Ci sono, ovviamente, ragioni molto più convincenti. ;-) – Aya

+0

Fantastico, grazie. Sono assolutamente d'accordo sul fatto che PEP8 sia una linea guida. Usiamo flake8 (che combina pyflakes e pep8.py), e ho capito che c'era * qualcosa * che avrebbe soddisfatto lo spirito di PEP8 e anche i linters. – stantonk

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

assert condition(a,b), ERR_MESSAGE_01 

È come lo faccio ... e penso che sia soddisfacente ..

+1

Quando il post parla della conformità PEP-8, i nomi di 'CAPS_WITH_UNDERSCORES' non aiutano. –

+0

sì punto giusto ... riporto da C#definiti e costanti. dubbioso ... ma mi sto attenendo.inoltre sto pensando ad una costante di livello modulo che pep8 ci dice di nominare come tale –

+3

Costanti: Le costanti sono generalmente definite a livello di modulo e scritte in lettere maiuscole con caratteri di sottolineatura che separano le parole. Gli esempi includono MAX_OVERFLOW e TOTAL. –

3

Vale la pena notare che è possibile avvolgere con parentesi, semplicemente non nel modo in cui si sta pensando.

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

Non direi che è particolarmente leggibile, tuttavia. In alcuni casi, potrebbe essere l'opzione giusta.

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

questo ti dà la continuazione linea implicita da parentesi che è raccomandato da PEP 8 senza rompere il comportamento assert.

alternativa:

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