Неуместное использование индексов
Анти-паттерн
Использование индексов повышает вероятность ошибок и снижает читаемость кода.
Пример 1¶
Плохо:
names = ['Alice', 'Bob', 'Charlie']
for num in range(len(names)):
greeting = f'Привет, {names[num]}!'
...
Хорошо:
names = ['Alice', 'Bob', 'Charlie']
for name in names:
greeting = f'Привет, {name}!'
...
Пример 2¶
В случае, если вам всё же нужны индексы/номера объектов в коллекции, используйте enumerate.
Плохо:
names = ['Alice', 'Bob', 'Charlie']
for num in range(len(names)):
greeting = f'Привет, {names[num]}! Ты №{num + 1} в списке.'
...
Хорошо:
names = ['Alice', 'Bob', 'Charlie']
for num, name in enumerate(names, start=1):
greeting = f'Привет, {name}! Ты №{num} в списке.'
...
Пример 3¶
По индексу сложно понять с каким значением придётся работать, поэтому лучше использовать переменные с говорящими названиями.
Плохо:
deal_name = 'Сделка_1'
parts = deal_name.split('_')
parts[-1] = str(int(parts[-1]) + 1)
new_deal_name = '_'.join(parts)
Хорошо:
deal_name = 'Сделка_1'
*deal_name_parts, deal_serial_number = deal_name.split('_')
new_deal_serial_number = str(int(deal_serial_number) + 1)
new_deal_name = '_'.join([*deal_name_parts, new_deal_serial_number])
Пример 4¶
Если известно, что будет возвращена всего пара элементов, можно заменить индекс на прозрачную распаковку.
Плохо:
import os
def get_extension(link):
extension_index = 1
extension = os.path.splitext(link)[extension_index]
return extension
Плохо:
import os
def get_extension(link):
extension_index = -1
extension = os.path.splitext(link)[extension_index]
return extension
Плохо:
import os
def get_extension(link):
extension = os.path.splitext(link)[1]
return extension
Плохо:
import os
def get_extension(link):
extension = os.path.splitext(link)[-1]
return extension
Хорошо:
import os
def get_extension(link):
_, extension = os.path.splitext(image_link)
return extension