Ответ
Ответ не найден
Ответ 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 должно выглядеть? Это ж бред сивой кобылы, чих-пых тебя в сраку! Интерпретатор в ахуе, ты в ахуе, все в ахуе.
Так что же делать-то, спросишь ты? А делать надо вот что, чувак:
-
Проверяй, блядь, на None. Перед тем как лезть в атрибуты или вызывать методы, спроси: «А ты вообще не None?»
if user is not None: print(user.name) else: print("Пользователь — призрак, нихуя нет.") -
Используй «защитные» паттерны. Например, оператор
orс дефолтным значением.safe_name = (user or dummy_user).nameИли новый, охуенный оператор
:=(морж), чтобы и проверить, и присвоить.if (data := get_some_data()) is not None: process(data) # Ура, data точно не None! -
Пиши функции, которые не плюются None налево и направо. Лучше верни пустой список
[], пустой словарь{}, «пустышку» (default object) или выкинь нормальное, понятное исключение.None— это не всегда лучший способ сказать «ничего нет». Иногда это способ сказать «держи, дружок, мину в кармане».
Короче, суть в чём. None в Python — это не просто «ничего». Это активная, ебаная сущность, которая любит ломать код в самых неожиданных местах. Относись к нему с уважением, всегда подозревай и перепроверяй. И тогда твой код не накроется медным тазом в самый ответственный момент. Всем пизда, вопросов нет?