← Назад к вопросам

Сталкивался ли с использованием underscore для объявления аргумента как неиспользуемый

2.3 Middle🔥 111 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Использование 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. Используй его везде, где функция получает аргумент, который ей не требуется.