Ogni numero senza nome che non è immediatamente evidente dal contesto è un numero magico. È un po 'sciocco definire i numeri che hanno un significato immediatamente evidente dal contesto.
In django (framework web python), posso definire alcuni campi del database con un numero raw come:
firstname = models.CharField(max_length=40)
middlename = models.CharField(max_length=40)
lastname = models.CharField(max_length=40)
che è più chiaro (e la pratica consigliata ) che dire
MAX_LENGTH_NAME = 40
...
firstname = models.CharField(max_length=MAX_LENGTH_NAME)
middlename = models.CharField(max_length=MAX_LENGTH_NAME)
lastname = models.CharField(max_length=MAX_LENGTH_NAME)
perché è improbabile che abbia mai bisogno di modificare la lunghezza (e può sempre comparare con il max_length
del campo). Se devo modificare la lunghezza del campo dopo aver inizialmente distribuito l'applicazione, ho bisogno di cambiarlo esattamente in una posizione per ogni campo nel mio codice django, e quindi di scrivere anche una migrazione per cambiare lo schema del DB. Se dovessi mai fare riferimento a max_length
di un campo definito di un tipo di oggetto, posso farlo direttamente - se quei campi stavano definendo una classe Person
, posso usare Person._meta.get_field('firstname').max_length
per ottenere il max_length
essendo usato (che è definito in un posto). Il fatto che lo stesso 40 sia stato utilizzato per più campi è irrilevante in quanto potrei volerli cambiare in modo indipendente. La lunghezza del nome non dovrebbe mai dipendere dalla lunghezza di middlename o lastname; sono valori separati e possono cambiare indipendentemente.
Spesso gli indici di array possono usare numeri senza nome; come se avessi un file CSV di dati che voglio mettere in un dizionario python, con il primo elemento della riga come il dizionario key
vorrei scrivere:
mydict = {}
for row in csv.reader(f):
mydict[row[0]] = row[1:]
Certo, potrei chiamare index_column = 0
e fare qualcosa del tipo:
index_col = 0
mydict = {}
for row in csv.reader(f):
mydict[row[index_col]] = row[:index_col] + row[index_col+1:]
o peggio definisci after_index_col = index_col + 1
per eliminare index_col+1
, ma ciò non rende il codice più chiaro nella mia vista. Inoltre, se fornisco il index_col
di un nome, è meglio che il codice funzioni anche se la colonna non è 0 (quindi la parte row[:index_col] +
).