#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:
, потому что он замыкается и ему не нужно создавать промежуточный объект контейнера.