107 lines
2.2 KiB
Plaintext
107 lines
2.2 KiB
Plaintext
This rule raises an issue when operators ``++in++`` and ``++not in++`` are called with a right operand not supporting membership protocol.
|
|
|
|
== Why is this an issue?
|
|
|
|
Operators ``++in++`` and ``++not in++``, also called https://docs.python.org/3/reference/expressions.html#membership-test-operations["membership test operators"], require that the right operand supports the membership protocol.
|
|
|
|
|
|
In order to support the membership protocol, a user-defined class should implement at least one of the following methods: ``++__contains__++``, ``++__iter__++``, ``++__getitem__++``.
|
|
|
|
If none of these methods is implemented, a `TypeError` will be raised when performing a membership test.
|
|
|
|
== How to fix it
|
|
|
|
== Code examples
|
|
|
|
=== Noncompliant code example
|
|
|
|
[source,python]
|
|
----
|
|
myint = 42
|
|
|
|
if 42 in myint: # Noncompliant: integers don't support membership protocol
|
|
...
|
|
|
|
class A:
|
|
def __init__(self, values):
|
|
self._values = values
|
|
|
|
if "mystring" in A(["mystring"]): # Noncompliant: class A doesn't support membership protocol
|
|
...
|
|
----
|
|
|
|
|
|
=== Compliant solution
|
|
|
|
[source,python]
|
|
----
|
|
mylist = [42]
|
|
|
|
if 42 in mylist:
|
|
...
|
|
|
|
class MyContains:
|
|
def __init__(self, values):
|
|
self._values = values
|
|
|
|
def __contains__(self, value):
|
|
return value in self._values
|
|
|
|
if "mystring" in MyContains(["mystring"]):
|
|
...
|
|
|
|
# OR
|
|
|
|
class MyIterable:
|
|
def __init__(self, values):
|
|
self._values = values
|
|
|
|
def __iter__(self):
|
|
return iter(self._values)
|
|
|
|
if "mystring" in MyIterable(["mystring"]):
|
|
...
|
|
|
|
# OR
|
|
|
|
class MyGetItem:
|
|
def __init__(self, values):
|
|
self._values = values
|
|
|
|
def __getitem__(self, key):
|
|
return self._values[key]
|
|
|
|
if "mystring" in MyGetItem(["mystring"]):
|
|
...
|
|
----
|
|
|
|
|
|
== Resources
|
|
|
|
=== Documentation
|
|
|
|
* Python Documentation - https://docs.python.org/3/reference/expressions.html#membership-test-operations[Membership test operations]
|
|
|
|
ifdef::env-github,rspecator-view[]
|
|
|
|
'''
|
|
== Implementation Specification
|
|
(visible only on this page)
|
|
|
|
=== Message
|
|
|
|
Change the type of X; type Y does not support membership protocol.
|
|
|
|
|
|
For an expression like "a in X" where X has type Y
|
|
|
|
|
|
=== Highlighting
|
|
|
|
Primary: The "in" or "not in" operator
|
|
|
|
Secondary: The operator's right operand
|
|
|
|
|
|
endif::env-github,rspecator-view[]
|