if x или if x not is None

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
Добрый день. Всегда для проверки наличия значения для переменной(что она True) или списка(словаря, множества, etc), что он не пустой, использовал конструкцию if x, но вчера консоль начала ругацца на меня
FutureWarning: The behavior of this method will change in future versions. Use specific 'len(elem)' or 'elem is not None' test instead.
if odd:
Везде встречал упоминание, что вариант проверки if x самый-самый питоник, а вариант if len(x) применять не правильно. Что теперь изменилось? В Гугле упоминаний об этом программистском майдане не нашел. Спасибо.
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
973
220
43
21
Москва
Какой и тебя питон? у меня 3.10.2 и такого нет
 

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
3.8.1 у мну
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
973
220
43
21
Москва
Интересно, поставил 3.8.1, запустил в нем
Python:
a = []
if not a:
    print(0)
Отработало без ошибок
Можешь скинуть скрин ошибки?
 

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
ну это не ошибка, а предупреждение вроде бы
Скриншот 04-02-2022 152556.jpg

odd и zTru - это проверка условия наличия найденного веб-элемента, если есть элемент - if odd и if zTru истинно. кроме того, по коду всего скрипта такие проверки постоянно присутствуют. и до вчерашнего дня этих примочек вообще не наблюдал. колдунство какое-то)
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
973
220
43
21
Москва

Я так понял, что odd и if zTru это не списки, а схожие по поведению объекты. И у них по своему определяется истинность. Попробуй выполнить
typr(odd) и посмотри какой у него тип
 
  • Мне нравится
Реакции: Student и robisho

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
type(odd) <class 'lxml.html.HtmlElement'>
получается, что списки можно проверять как if x, а остальные объекты нужно if len(x)>0? хотелось бы раз и навсегда устаканить различие)
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 672
478
83
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
973
220
43
21
Москва
У некоторых объектов определен метод __bool__ который отвечает за сравнивание объектов, если его нет, объект по умолчанию True

Python:
class Test:
    def __init__(self, n):
        self.n = n
    
    def __bool__(self):
        if self.n > 10:
            return True
        else:
            return False

a = Test(5)   # False
b = Test(15)  # True

if a:
    print('a')  # Не отработает

if b:
    print('b')  # Отработает

То же самое и с длинной объекта
 

Форум IT Специалистов