rspec/rules/S5642/python/rule.adoc
2021-04-28 16:49:39 +02:00

71 lines
1.8 KiB
Plaintext

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 membership protocol.
In order to support this membership protocol a user-defined class should implement at least one of the following methods: ``++__contains__++``, ``++__iter__++``, ``++__getitem__++``.
This rule raises an issue when operators ``++in++`` and ``++not in++`` are called with a right operand not supporting membership protocol.
== Noncompliant Code Example
----
myint = 42
if 42 in myint: # Noncompliant. Integers don't support membership protocol
pass
class A:
def __init__(self, values):
self._values = values
if "mystring" in A(["mystring"]): # Noncompliant. Class A doesn't support membership protocol
pass
----
== Compliant Solution
----
mylist = [42]
if 42 in mylist:
pass
class MyContains:
def __init__(self, values):
self._values = values
def __contains__(self, value):
return value in self._values
if "mystring" in MyContains(["mystring"]): # Noncompliant. Class A don't support membership protocol
pass
# OR
class MyIterable:
def __init__(self, values):
self._values = values
def __iter__(self):
return iter(self._values)
if "mystring" in MyIterable(["mystring"]): # Noncompliant. Class A don't support membership protocol
pass
# OR
class MyGetItem:
def __init__(self, values):
self._values = values
def __getitem__(self, key):
return self._values[key]
if "mystring" in MyGetItem(["mystring"]): # Noncompliant. Class A don't support membership protocol
pass
----
== See
* https://docs.python.org/3/reference/expressions.html#membership-test-operations[Python documentation - Membership test operations]