Каждый неназванный номер, который не сразу очевиден из контекста, является магическим числом. Немного глупо определять числа, которые имеют значение, которое сразу видно из контекста.
В django (веб-фреймворк Python) я могу определить поле базы данных с необработанным числом, например:
firstname = models.CharField(max_length=40)
middlename = models.CharField(max_length=40)
lastname = models.CharField(max_length=40)
что яснее (и рекомендуемая практика ) чем сказать
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)
так как мне вряд ли когда-нибудь понадобится менять длину (и всегда можно сравнить с max_lengthполем). Если мне нужно изменить длину поля после первоначального развертывания приложения, мне нужно изменить его точно в одном месте на поле в моем коде django, а затем дополнительно написать миграцию для изменения схемы БД. Если мне когда-либо понадобится ссылка max_lengthна определенное поле типа объекта, я могу сделать это напрямую - если эти поля определяли Personкласс, я могу использовать Person._meta.get_field('firstname').max_lengthдля полученияmax_lengthиспользуется (который определяется в одном месте). Тот факт, что те же 40 использовались для нескольких полей, не имеет значения, так как я могу захотеть изменить их независимо. Длина имени не должна зависеть от длины среднего имени или фамилии; они являются отдельными значениями и могут меняться независимо.
Часто индексы массива могут использовать безымянные числа; например, если у меня есть файл данных CSV, который я хочу поместить в словарь Python, с первым элементом в строке в качестве словаря, который keyя бы написал:
mydict = {}
for row in csv.reader(f):
mydict[row[0]] = row[1:]
Конечно, я мог бы назвать index_column = 0и сделать что-то вроде:
index_col = 0
mydict = {}
for row in csv.reader(f):
mydict[row[index_col]] = row[:index_col] + row[index_col+1:]
или, что еще хуже, определение, after_index_col = index_col + 1чтобы избавиться от index_col+1, но это не делает код более понятным, на мой взгляд. Кроме того, если я даю index_colимя, я лучше заставлю код работать, даже если столбец не равен 0 (отсюда и row[:index_col] +часть).