2013-04-19 13 views
16

PEP 8 consiglia di utilizzare un singolo trattino basso per evitare conflitti con le parole chiave python, ma per quanto riguarda i conflitti con i nomi dei moduli per i moduli standard Python? Dovrebbe essere anche un singolo trattino basso?Esiste una convenzione di denominazione Python per evitare conflitti con i nomi di moduli standard?

sto immaginando qualcosa di simile:

import time 
time_ = time.time() 
+0

+1 per far apparire PEP 8 - hai risposto alla mia domanda con la tua domanda menzionandola! Ora devo tornare indietro e rinominare tutte le variabili locali '_file' e' _id' come 'file_' e' id_' invece ... – ArtOfWarfare

risposta

8

PEP 8 non sembra affrontare direttamente.

La sottolineatura finale è ovviamente necessaria quando sei collisione con una parola chiave, perché il codice altrimenti sollevare un SyntaxError (o, se si è davvero sfortunato, compilare per significare qualcosa di completamente diverso di quanto previsto).

Quindi, anche in contesti in cui si ha un attributo di classe, un attributo di istanza, un parametro di funzione o una variabile locale che si desidera nominare class, è necessario andare con class_.

Ma lo stesso non vale per time. E in questi casi, penso che l'non dovrebbe postfix un trattino di sottolineatura per time.

Esiste un precedente per quello: più classi nello stdlib stesso hanno metodi o attributi dati denominati time (e nessuno di essi ha time_).


Naturalmente c'è il caso in cui si sta creando un nome alla stessa portata del modulo (di solito significa una variabile o funzione globale). Quindi hai molto più potenziale per la confusione e nascondi la possibilità di accedere a qualsiasi cosa sul modulo time per il resto dell'ambito corrente.

Penso che il 90% delle volte, la risposta sarà "Non dovrebbe essere globale".


Ma questo lascia ancora l'altro 10%.

E c'è anche il caso in cui il tuo nome è in un namespace ristretto, ma che namespace è un ambito locale all'interno di una funzione in cui è necessario accedere al modulo time.

O, forse, in una funzione lunga e complicata (che non dovresti avere, ma ... a volte lo fai). Se non fosse ovvio per un lettore umano che time fosse un locale piuttosto che un modulo, è altrettanto pessimo che confondere l'interprete.

Qui, penso che il 99% del tempo rimanente, la risposta è "Basta scegliere un nome diverso".

Per esempio, un'occhiata a questo codice:

def dostuff(iterable): 
    time = time.time() 
    for thing in iterable: 
     dothing(thing) 
    return time.time() - time # oops! 

La risposta ovvia è quella di rinominare la variabile start o t0 o qualcos'altro. Oltre a risolvere il problema, è anche un nome più significativo.


Ma questo lascia ancora l'1%.

Ad esempio, esistono librerie che generano codice Python da, ad esempio, una specifica di protocollo o un'interfaccia .NET o ObjC, in cui i nomi non sono sotto il vostro controllo; tutto quello che puoi fare è applicare una sorta di regola programmatica e non ambigua ai nomi tradotti. In questo caso, penso che una regola che aggiunge _ ai nomi di moduli stdlib e alle parole chiave potrebbe essere una buona idea.

Probabilmente si possono trovare altri esempi in cui la variabile non può essere semplicemente rinominata arbitrariamente e deve (almeno potenzialmente) vivere nello stesso ambito del modulo time e così via. In questi casi, sceglierei il suffisso _.

+0

Quindi stai dicendo che se ho bisogno di creare una variabile locale in una funzione I dovresti semplicemente usare il nome time e clobber il pacchetto per il resto di quella funzione? – chappy

+0

@chappy: Beh, no, penso che dovresti "Basta scegliere un nome diverso". E dovresti anche avere per lo più funzioni ragionevolmente brevi e semplici, nel qual caso il "clobbering" probabilmente non farà alcuna differenza e, cosa più importante, che la non-differenza dovrebbe essere ovvia per qualsiasi lettore umano. Nelle rare occasioni in cui nessuno di questi si applica, quindi sicuro, vai con 'time_'. Ma sospetto che non si presenterà mai nella tua intera vita di programmazione. – abarnert

+0

@chappy: Questo ovviamente non era chiaro dalla mia risposta, e avrebbe dovuto essere, quindi ... fammi provare a riscriverlo. – abarnert

Problemi correlati