Зачем нужен файл .gitignore

Ответ

Ответ не найден

Ответ 18+ 🔞

Слушай, вот сидишь ты такой, пишешь на Python, всё вроде красиво, импорты, классы... А потом бац — AttributeError: 'NoneType' object has no attribute 'something'. И сидишь, блядь, и смотришь в экран, как баран на новые ворота. «Где же я, сука, на None наступил?» — думаешь. А он, этот None, он как хитрая жопа — подкрался сзади и впендюрил тебе ошибку прямо в рантайм.

Вот, например, классика жанра, ебать мои старые костыли:

def get_user_data(user_id):
    # Тут какой-то запрос в базу, который может вернуть None
    result = db_query("SELECT * FROM users WHERE id = %s", (user_id,))
    return result if result else None

user = get_user_data(42)
print(user.name)  # АААА! ПИЗДЕЦ! AttributeError!

Смотри, что происходит. Функция get_user_data может вернуть объект пользователя, а может и None, если юзера нет. И ты, такой довольный, пытаешься у этого user взять атрибут .name. А у None, блядь, никакого .name нет и быть не может! Это как спросить у пустого стула: «Ну-ка, расскажи анекдот». Он тебе нихуя не расскажет, он же стул, ёпта!

Или вот ещё перл, от которого волосы дыбом встают:

my_list = [1, 2, 3, 4, 5]
filtered = list(filter(lambda x: x > 10, my_list))
first_element = filtered[0] if filtered else None
# А дальше...
result = first_element * 2  # Может быть TypeError: unsupported operand type(s) for *: 'NoneType' and 'int'

Ты фильтруешь список, ищешь элемент больше 10. Их нет, список filtered — пустой. Ты осторожно, молодец, проверяешь: if filtered. Берёшь первый элемент, а его нет — значит first_element = None. А потом пытаешься этот None на 2 умножить! Ну и как, по-твоему, None * 2 должно выглядеть? Это ж бред сивой кобылы, чих-пых тебя в сраку! Интерпретатор в ахуе, ты в ахуе, все в ахуе.

Так что же делать-то, спросишь ты? А делать надо вот что, чувак:

  1. Проверяй, блядь, на None. Перед тем как лезть в атрибуты или вызывать методы, спроси: «А ты вообще не None?»

    if user is not None:
        print(user.name)
    else:
        print("Пользователь — призрак, нихуя нет.")
  2. Используй «защитные» паттерны. Например, оператор or с дефолтным значением.

    safe_name = (user or dummy_user).name

    Или новый, охуенный оператор := (морж), чтобы и проверить, и присвоить.

    if (data := get_some_data()) is not None:
        process(data)  # Ура, data точно не None!
  3. Пиши функции, которые не плюются None налево и направо. Лучше верни пустой список [], пустой словарь {}, «пустышку» (default object) или выкинь нормальное, понятное исключение. None — это не всегда лучший способ сказать «ничего нет». Иногда это способ сказать «держи, дружок, мину в кармане».

Короче, суть в чём. None в Python — это не просто «ничего». Это активная, ебаная сущность, которая любит ломать код в самых неожиданных местах. Относись к нему с уважением, всегда подозревай и перепроверяй. И тогда твой код не накроется медным тазом в самый ответственный момент. Всем пизда, вопросов нет?