Проверьте, является ли объект итерируемым, используя тождество "is" вместо равенства "==" - PullRequest
0 голосов
/ 05 ноября 2019
if object in lst:
    #do something

Насколько я могу судить, когда вы выполняете этот оператор, он внутренне проверяет == между object и каждым элементом в lst, что будет ссылаться на методы __eq__ этих двух объектов. ,Это может означать, что два разных объекта являются «равными», что обычно желательно, если все их атрибуты одинаковы.

Однако, есть ли способ Pythonically получить предикат, такой как in, гдебазовая проверка на равенство is - т.е. мы фактически проверяем, относятся ли две ссылки к одному и тому же объекту?

Ответы [ 3 ]

0 голосов
/ 05 ноября 2019

, если вы хотите специально использовать is, тогда просто используйте фильтр как:

filtered_list = filter(lambda n: n is object, list)
0 голосов
/ 05 ноября 2019

3list членство в python продиктовано методом __contains__ dunder. Вы можете перезаписать это для пользовательской реализации, если хотите использовать обычный синтаксис «in»:

class my_list(list):
    def __contains__(self, x):
        for y in self:
            if x is y:
                return True

        return False


4 in my_list([4, [3,2,1]])

>> True

[3,2,1] in my_list([4, [3,2,1]])  # Because while the lists are "==" equal, they have different pointers.

>>> False

В противном случае, я бы предложил kaya3 ответ об использовании проверки генератора.

0 голосов
/ 05 ноября 2019

Используйте функцию any:

if any(x is object for x in lst):
    # ...
...