параметр передается в функцию, но не используется (намеренно)

Имеется функция, вызывающая множество других функций и передающая в них два параметра. При этом только в части функций используются оба параметра, в других же - только один из них. Вызывать каждую функцию индивидуально не вариант.

Пример:

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. Плохо ли, если какой-либо параметр в функции остается неиспользованным, и почему?
  2. Есть ли принципиальная разница между первым и вторым способом? Все же во втором случает так же передается два значения, а читать первый гораздо приятнее.
  3. Есть ли еще какие-нибудь варианты в этом случае?

Ответы (1 шт):

Автор решения: Xander

Так вполне делают, ничего плохого в неиспользуемых переменных нет.

Если такая переменная одна и она позиционная, то её имя лучше заменить на символ подчёркивания - это устоявшееся обозначение того, что переменная неиспользуемая. В этом случае даже многие 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
→ Ссылка