Сталкивался ли с использованием underscore для объявления аргумента как неиспользуемый
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Использование underscore для неиспользуемых аргументов
Обзор практики
Да, это очень распространённая практика в Python-сообществе. Underscore (_) используется как имя переменной для обозначения аргумента, который функция получает, но не использует. Это важно для читаемости и соответствия PEP 8.
Основные случаи использования
1. Обработчики событий в GUI
from tkinter import Tk, Button
def on_click(_):
print("Кнопка нажата")
root = Tk()
button = Button(root, text="Нажми", command=on_click)
button.pack()
Кнопка передаёт событие, но обработчику оно не нужно.
2. Обработчики вебхуков и сигналов
from flask import Flask, request
app = Flask(__name__)
@app.route(/webhook, methods=[POST])
def handle_webhook(_):
# Аргумент request из контекста Flask, но явно не используем
return {"status": "ok"}
def signal_handler(signum, _): # frame не используется
print(f"Получен сигнал {signum}")
exit(0)
3. Функции обратного вызова
def process_items(items, callback):
for i, item in enumerate(items):
callback(item, i)
# Индекс не нужен
def log_item(item, _):
print(f"Элемент: {item}")
process_items([1, 2, 3], log_item)
4. Итерация с распаковкой в цикле
data = [("Alice", 25), ("Bob", 30), ("Charlie", 35)]
# Используем только имена
for name, _ in data:
print(name)
# Или наоборот
for _, age in data:
if age >= 30:
print(f"Возраст: {age}")
5. Множественная распаковка
headers, _, body = response.split(
, 2)
# Или в функции
def parse_config(*args, **kwargs):
first = args[0] if args else None
_ = args[1:] # Остаток не используем
return first
Лучшие практики
Используй _ только для явно игнорируемых значений:
# ✅ Хорошо — явно показываем, что value не нужен
for key, _ in dict.items():
process_key(key)
# ❌ Плохо — непонятно, почему не используется
for key, value in dict.items():
process_key(key)
Для нескольких неиспользуемых переменных:
# ✅ Одна переменная — понятно
def callback(value, _):
print(value)
# ❌ Несколько _ невозможны
# def callback(_, _): # SyntaxError!
# Альтернатива:
def callback(*args):
value = args[0]
print(value)
В type hints также используется _:
from typing import Callable
handler: Callable[[str, int], None] = lambda msg, _: print(msg)
Интеграция с linters
SonarQube, Ruff и другие linters распознают _ как намеренное игнорирование:
# Без _ — linter предупредит об неиспользуемом аргументе
def bad_handler(event, unused_param): # ⚠️ warning
return event
# С _ — всё в порядке
def good_handler(event, _): # ✅ OK
return event
Исторический контекст
В Python эта практика идёт из Lisp и других функциональных языков, где _ обозначает "дырявую" позицию в pattern matching. В современном Python это стало стандартом в PEP 8 и широко используется во всех крупных проектах (Django, Flask, asyncio).
Вывод
Underscore — это идиоматический способ показать намерение игнорировать значение. Это улучшает читаемость, помогает linters и соответствует стилю Python. Используй его везде, где функция получает аргумент, который ей не требуется.