Как мне эффективно проверить наличие переменной в наборе?

#python #list #syntax #set #keyword

#python #Список #синтаксис #набор #ключевое слово

Вопрос:

Я работаю над логикой, согласно которой, если какая-либо из 3 переменных ( var1 , var2 , var3 ) является None определенной, функция foo() не может быть вызвана. Код, который я использовал:

 if None in {var1, var2, var3}:
    print("some variable is None")
  

Однако это вызывает и исключение : unhashable type: 'list' . Он отлично работает, если я использую:

 if None in [var1, var2, var3]:
    print("some variable is None")
  

Но предостережение в том, что это происходит только тогда, когда я реализую эту логику в своем приложении с графическим интерфейсом, имеющем много классов и ~ 3000 строк кода. Если я протестирую эту логику в фиктивном скрипте, она отлично работает как для наборов {} , так и для списков () . Кажется, я не могу понять, что здесь происходит. Мой фиктивный скрипт:

 class my_class:
    a = {None, 32, 44}

    def check(self):
        if None in self.a:
            print("some variable is None")
            return None
        foo()

cls = my_class
cls.foo(cls)
  

Комментарии:

1. Предположительно varX , это списки? Не могли бы вы переключиться на кортежи, которые могут входить в наборы?

2. Если это работает in [...] , почему бы не использовать его? Или что-то вроде any(i is None for i in (var1, var2, var3)) ?

3. @jonrsharpe Что вы подразумеваете под «которые могут входить в наборы»? Я думал, что мы могли бы использовать любой объект внутри наборов?

4. Нет, вы можете помещать хешируемые объекты только в наборы, отсюда и ошибка.

5. @AsadUllahButt Самый эффективный метод — это просто if var1 is None or var2 is None or var3 is None: , потому что он замыкается и ему не нужно создавать промежуточный объект контейнера.