2016-12-05 15 views

Odpowiedz

16

in to __contains__ i is nie ma metody dunder. Sugeruję użyć funkcji w operator module:

a < b => operator.lt(a, b) 
a == b => operator.eq(a, b) 
a in b => operator.contains(a, b) 
a is b => operator.is_(a, b) 
+0

Dlaczego moduł 'operator' miałby być lepszy od zwykłego sposobu? –

+0

Nie będzie, ale jeśli potrzebujesz wersji funkcjonalnych operatorów, moduł operatorski jest lepszy niż dostęp do metod dunderów lub pisanie własnych owijaczy. –

+3

Przeczytałem 'getattr (a, '__lt __') (b)' jako pytanie o wersję funkcji 'a

26

Dla in prawidłową metodą dunder jest __contains__.

Nie ma metody dla is, ponieważ jest to odpowiednik id(a) == id(b). Porównuje rzeczywisty identyfikator obiektu używany pod maską przez Python, więc jest używany do porównywania tożsamości obiektu, a nie zawartości obiektu. Nadpisanie go w klasie przerwałoby model obiektowy Pythona, więc nie jest dozwolone.

1

__contains__ jest poprawna dla in, z opcjami fall-back jeśli __contains__ nie jest zdefiniowany jako __iter__ i __getitem__.

Nie jestem do końca pewien, dlaczego należy użyć getattr dla is jednak; is jest "zdefiniowany" dla obiektu co każdy obiekt w języku Python. Nie ma potrzeby przechodzenia przez operator._is lub (próbowanie i niepowodzenie) przez getattr.

See the documentation on built-in types:

Zachowanie is i is not operatorów nie można dostosować; także mogą być stosowane do dowolnych dwóch obiektów i nigdy nie wywołują wyjątku.

(Kopalnia nacisk)

Według fragmentów podanych przez Ciebie, który właśnie złapał funkcję i wywołać ją przy użyciu getattr(a, "function")(b), masz już nazwy obiektów, które trzeba ocenić, wystarczy użyć is natychmiast; jest zawsze dostępny.

Powiązane problemy