Как указать несколько неиспользуемых значений в Python?

Обычно в Python нужно использовать _ чтобы указать аргумент не используется.

def example_basic(unused):
   pass

становится

def example_basic(_):
   pass

Тогда, если есть несколько неиспользованных аргументов, несколько _не могут быть использованы, так как они будут конфликтовать, поэтому *_ используется:

def example_multiple(unused1, unused2):
   pass

становится

def example_multiple(*_):
   pass

Наконец, что делать, если есть несколько несмежных аргументов, которые остаются неиспользованными?

def example_non_adjacent(unused1, used, unused2):
    return used

Использование нескольких _с по прежнему не работает, а с помощью *_ не будет работать, так как они несмежные.

Обратите внимание, что я бы очень предпочел изменить API, но ради этого вопроса давайте предположим, что это невозможно. Есть ли способ указать, что он игнорируется, не используя что-то вроде # pylint: disable=unused-argument для PyLint или i-dont-know-what для PyCharm?

РЕДАКТИРОВАТЬ:

Я разместил пример, где это необходимо здесь

4 ответа

Решение

Я видел коды, использующие следующую идиому;

def example_non_adjacent(_0, used, _1, _2, _3, also_used):
    ...

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

Тем не менее, тот факт, что переменная не используется, не означает, что код будет более читабельным, если вы пропустите его собственное имя. Это следует делать только в том случае, если вы действительно считаете, что сокрытие имен переменных улучшает читабельность и / или понимание кода.

Просто del их. Молниеносно из-за работы сборщика мусора.

def test(test):
    del test

    print('I do not need test parameter here!')

Если вы передаете параметры с помощью метода обратного вызова, дайте им правильное имя и del их. Не обозначайте их как неиспользованные.

Это пример функции обратного вызова:

def handle(socket, address):
    del address  # del is as efficient as a newline ;-)

    stream = bytes()
    while True:
        chunk = socket.recv()
        if not chunk:
            break

        stream += chunk

    return stream

Pythonistas обычно не используют _ подчеркивание имени аргумента возможно в любом случае.
Возможно, вы неправильно поняли использование _ подчеркивание в качестве имени для бесполезной переменной.

Понятно использовать _ для имени переменной, когда мы не знаем, как ее вызвать и / или она не будет использоваться:

# ignore variables when unpacking a tuple
def test():
    """some code here"""

    top = 10
    right = 10
    bottom = 40
    left = 10

    return top, right, bottom, left


# here we ignore right and left
top, _, bottom, _ = test()

# use top and bottom in your code

Pylint (и, скорее всего, другие читатели вашего кода) будут так же счастливы, если вы объедините несколько подчеркиваний. Pylint не будет жаловаться на неиспользованные аргументы, если вы сделаете это:

def example_non_adjacent(_, used, __):
    return used

Я согласен с некоторыми комментаторами, в которых это уродливо, и я бы постарался избежать этого всеми средствами.

Pylint (и большинство читателей-людей, я думаю) тоже не будет жаловаться, если вы добавите префиксcb_в имена ваших функций, чтобы передать тот факт, что они являются обратными вызовами, и вы должны получить некоторые аргументы, даже если вы не хотите их использовать. Это выглядит как лучшее решение для меня.

def cb_example_non_adjacent(unused1, used, unused2):
    return used

Я полностью согласен с @jmd_dk по этому вопросу. То, что функция на самом деле не ссылается на аргумент и не изменяет его, не означает, что он не "используется". В конце концов, он должен быть создан и явно передан функции. Единственное оправданное использование символов подчеркивания для имен переменных - это использование for-циклы и списки:

numbers = {_ for _ in range(10)}

for _ in numbers:
    print("Foo!")

Но тот факт, что вам нужно такое решение, означает, что в вашем коде есть проблема дизайна.

Другие вопросы по тегам