Uploaded image for project: 'Rules Repository'
  1. Rules Repository
  2. RSPEC-5720

"self" should be the first argument to instance methods

    Details

    • Message:
      Rename XXX to "self" or add the missing "self" parameter.
    • Highlighting:
      Hide

      Instance method's first parameter

      Show
      Instance method's first parameter
    • List of parameters:
      • key: ignoredDecorators
      • description: Comma-separated list of decorators which will disable this rule.
      • default: abstractmethod
    • Default Severity:
      Critical
    • Impact:
      High
    • Likelihood:
      Low
    • Default Quality Profiles:
      Sonar way
    • Covered Languages:
      Python
    • Irrelevant for Languages:
      ABAP, APEX, C#, C, C++, Cobol, CSS, Flex, Go, HTML, Java, JavaScript, Kotlin, Objective-C, PHP, PL/I, PL/SQL, RPG, Ruby, Rust, Scala, Solidity, Swift, T-SQL, TypeScript, VB.Net, VB6, XML
    • Analysis Level:
      Syntactic Analysis
    • Analysis Scope:
      Main Sources, Test Sources

      Description

      Instance methods, i.e. methods not annotated with @classmethod or @staticmethod, are expected to have at least one parameter. This parameter will reference the object instance on which the method is called. By convention, this first parameter is named "self".

      Naming the "self" parameter differently is confusing. It might also indicate that the "self" parameter was forgotten, in which case calling the method will most probably fail.

      Note also that creating methods which are used as static methods without the @staticmethod decorator is a bad practice because calling these methods on an instance will raise a `TypeError`. Either move the method out of the class or decorate it with @staticmethod.

      This rule raises an issue when the first parameter of an instance method is not called "self".

      Noncompliant Code Example

      class MyClass:
          def send_request(request):  # Noncompliant. "self" was probably forgotten
              print("send_request")
      
      class ClassWithStaticMethod:
          def static_method(param):  # Noncompliant
              print(param)
      ClassWithStaticMethod().static_method(42)  # Method is available on the instance but calling it will raise a TypeError
      

      Compliant Solution

      class MyClass:
          def send_request(self, request):
              print("send_request")
      
      class ClassWithStaticMethod:
          @staticmethod
          def static_method(param):
              print(param)
      ClassWithStaticMethod().static_method(42)
      

      Exceptions

      This rule will also accept "cls" or "mcs" as first parameter's name for metaclasses' methods.

      No issue will be raised for methods called __init_subclass__, __class_getitem__ or __new__ as these methods' first parameter is a class.

      You can also disable issues on methods decorated with a specific decorator. Add these decorators to this rule's "ignoreDecorators" parameter.

      With "ignoredDecorators" set to "abstractmethod"

      from abc import abstractmethod, ABC
      
      class MyClass(ABC):
          @abstractmethod
          def method():  # No issue, even if it is better in this case to also decorate with @staticmethod
              pass
      

      See

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                Unassigned
                Reporter:
                nicolas.harraudeau Nicolas Harraudeau
              • Votes:
                0 Vote for this issue
                Watchers:
                1 Start watching this issue

                Dates

                • Created:
                  Updated: