Как указать несколько неиспользуемых значений в 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!")
Но тот факт, что вам нужно такое решение, означает, что в вашем коде есть проблема дизайна.