Questo è diventato un po 'un elenco di opzioni diverse, piuttosto che una risposta diretta. Tuttavia, due concetti sono di primaria importanza:
- Gli utenti dovrebbero essere in grado di sostituire
range
e xrange
se esplicitamente scelgono di; ma
- Gli utenti non dovrebbero essere in grado di sostituire implicitamente/accidentalmente
range
e xrange
;
dovrebbe sempre essere chiaro ai lettori del loro codice in cui vengono utilizzati i built-in e dove vengono utilizzate le sostituzioni.
Per questo motivo, tutte le opzioni che ho delineato sotto impediscono l'importazione da di caratteri jolly (from inclusive import *
) dallo shadowing dei built-in.Qual è l'opzione migliore per te dipende se vedi la sostituzione dei built-in come uso primario o secondario del tuo modulo. Gli utenti generalmente vogliono sostituire i built-in o usarli l'uno accanto all'altro?
Nella tua posizione, penso che vorrei fare quanto segue:
inclusive.py
:
"""Inclusive versions of range and xrange."""
__all__ = [] # block 'from inclusive import *'
old_range, old_xrange = range, xrange # alias for access
def range(...): # shadow the built-in
...
def xrange(...): # ditto
...
Questo permette agli utenti di entrambi:
import inclusive
e accesso inclusive.range
e inclusive.xrange
;
from inclusive import range, xrange
, che sostituisce chiaramente il built-in senza spiacevoli effetti collaterali; oppure
from inclusive import range as irange, xrange as ixrange
per utilizzare le versioni integrata e di sostituzione l'una accanto all'altra.
Definire __all__
come una lista vuota significa che from inclusive import *
non sarà tranquillamente ombra le built-in.
Se davvero voleva, si potrebbe aggiungere:
irange, ixrange = range, xrange
alla fine del inclusive.py
e modificare la definizione __all__
a:
__all__ = ['irange', 'ixrange']
Ora gli utenti hanno due opzioni aggiuntive:
from inclusive import irange, ixrange
(leggermente più semplice dell'aliasing manuale delle funzioni come nell'opzione 3 sopra); e
from inclusive import *
(stesso risultato come sopra, ancora nessuna ombreggiatura implicita di built-in).
Naturalmente, si potrebbe andare completamente nella direzione opposta - nominare le proprie versioni irange
e ixrange
, quindi se l'utente vuole davvero per sostituire i built-in avrebbero dovuto:
from inclusive import irange as range, ixrange as xrange
Questo non richiede di definire __all__
per evitare un'importazione di caratteri jolly che ombreggia i built-in.
Buona domanda. Il primo esempio non è buono. Se dovessi evitare di usare gli stessi nomi, li chiamerei 'inclusive.irange()' e 'inclusive.ixrange()'. Ma forse usando 'range()' e 'xrange()' è OK. – wrgrs