параметр передается в функцию, но не используется (намеренно)
Имеется функция, вызывающая множество других функций и передающая в них два параметра. При этом только в части функций используются оба параметра, в других же - только один из них. Вызывать каждую функцию индивидуально не вариант.
Пример:
def dwarven_miners(player, enemy):
player.stat['wall'] += 4
player.stat['quarry'] += 1
Параметр enemy не используется. Тогда я заменила параметры списком *args:
def flood_water(*players):
if players[0].stat['wall'] > players[1].stat['wall']:
players[1].stat['dungeon'] -= 1
players[1].stat['tower'] -= 2
elif players[0].stat['wall'] < players[1].stat['wall']:
players[0].stat['dungeon'] -= 1
players[0].stat['tower'] -= 2
Но так читаемость кода ухудшилась.
Вопросы:
- Плохо ли, если какой-либо параметр в функции остается неиспользованным, и почему?
- Есть ли принципиальная разница между первым и вторым способом? Все же во втором случает так же передается два значения, а читать первый гораздо приятнее.
- Есть ли еще какие-нибудь варианты в этом случае?
Ответы (1 шт):
Так вполне делают, ничего плохого в неиспользуемых переменных нет.
Если такая переменная одна и она позиционная, то её имя лучше заменить на символ подчёркивания - это устоявшееся обозначение того, что переменная неиспользуемая. В этом случае даже многие IDE уже не будут её подчёркивать.
Вот так:
def dwarven_miners(player, _):
player.stat['wall'] += 4
player.stat['quarry'] += 1
Если у вас не используются более одной переменной, они все позиционные и все идут после используемых переменных, то можно использовать и синтаксис с *. Но при этом используемые переменные нужно всё-таки оставить отдельно, чтобы не нужно было обращаться к ним по индексу.
Вот так:
def dwarven_miners(player, _*): # Сюда можно передать сразу много переменных
player.stat['wall'] += 4
player.stat['quarry'] += 1
Аналогично будет работать и с передачей именованных аргументов. В этом случае уже нет требования, чтобы вызывающий код передавал аргументы в определённом порядке.
def dwarven_miners(player=None, **_):
player.stat['wall'] += 4
player.stat['quarry'] += 1