All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.sonar.l10n.py.rules.python.S5644.html Maven / Gradle / Ivy

There is a newer version: 4.23.0.17664
Show newest version

This rule raises an issue when an item operation is performed on an object which doesn’t have the corresponding method.

Why is this an issue?

Getting, setting and deleting items using square brackets requires the accessed object to have special methods:

  • Getting items such as my_variable[key] requires my_variable to have the __getitem__ method, or the __class_getitem__ method if my_variable is a class.
  • Setting items such as my_variable[key] = 42 requires my_variable to have the __setitem__ method.
  • Deleting items such as del my_variable[key] requires my_variable to have the __delitem__ method.

Performing these operations on an object that doesn’t have the corresponding method will result in a TypeError.

To fix this issue, make sure that the class for which you are trying to perform item operations implements the required methods.

Code examples

Noncompliant code example

del (1, 2)[0]  # Noncompliant: tuples are immutable
(1, 2)[0] = 42  # Noncompliant
(1, 2)[0]

class A:
    def __init__(self, values):
        self._values = values

a = A([0,1,2])

a[0]  # Noncompliant
del a[0]  # Noncompliant
a[0] = 42  # Noncompliant

class B:
    pass

B[0]  # Noncompliant

Compliant solution

del [1, 2][0]  # Lists are mutable
[1, 2][0] = 42
[1, 2][0]

class A:
    def __init__(self, values):
        self._values = values

    def __getitem__(self, key):
        return self._values[key]

    def __setitem__(self, key, value):
        self._values[key] = value

    def __delitem__(self, key):
        del self._values[key]

a = A([0,1,2])

a[0]
del a[0]
a[0] = 42

class B:
    def __class_getitem__(cls, key):
        return [0, 1, 2, 3][key]

B[0]

Resources

Documentation





© 2015 - 2024 Weber Informatics LLC | Privacy Policy