35

So di non utilizzare mai nomi di funzioni predefiniti come identificatori di variabili.È una cattiva pratica usare un nome di funzione incorporato come attributo o identificatore del metodo?

Ma ci sono dei motivi per non usarli come identificatori di attributi o metodi?

Ad esempio, è sicuro scrivere my_object.id = 5 o definire un metodo di istanza dict nella mia classe?

+1

Correlato: ['id' è un nome variabile errato in Python] (http://stackoverflow.com/q/77552/95735) –

risposta

29

Non confonderà l'interprete ma potrebbe confondere chi legge il tuo codice. Evitare l'uso non necessario di nomi predefiniti per attributi e metodi.

Un altro effetto negativo è che i componenti incorporati di ombreggiamento confondono gli evidenziatori di sintassi nella maggior parte degli editor di Python (vi, emacs, pydev, idle, ecc.) Inoltre, alcuni degli strumenti per i lanci avviseranno di questa pratica.

13

No, va bene. Poiché è richiesto un riferimento a un oggetto, non c'è modo di far sì che l'ombra sia integrata.

+1

Quindi posso utilizzare qualsiasi identificatore valido come nome di attributo, tranne uno che inizia con ' __' o uno identico a una parola chiave? – max

+0

puoi utilizzare qualsiasi __qualizzazione o una parola chiave. Bene, alcuni con __ hanno un significato speciale. –

+0

Puoi avviarli con '__' a patto che finiscano * con * __'. Si noti che Python utilizza molti di questi per i propri scopi (come '__dict__',' __init__' e '__new__'). –

15

Sì, è una cattiva pratica. Potrebbe non rompere immediatamente nulla per te, ma danneggia comunque la leggibilità del codice.

citare selettivamente dalla PEP20:

Bello è meglio di brutto.
Semplice è meglio che complesso.
Contabilità.
Se l'implementazione è difficile da spiegare, è una cattiva idea.

Vedendo una chiamata a myobject.dict() sarebbe naturale pensare che sta andando a tornare myobject.__dict__, o che myobject.id() restituisce la stessa cosa di id(myobject)

E 'possibile per loro di scoprire che si sbaglia di grosso; ma ciò richiederà tempo e fatica e probabilmente porterà ad alcuni errori mentre lo capiscono. Chiamare il tuo attributo myobject.object_id_number è molto più lungo, ma rende più chiaro che è diverso da id(myobject)