# Messages control

`pylint` has an advanced message control for its checks, offering the ability to enable / disable a message either from the command line or from the configuration file, as well as from the code itself.

For all of these controls, `pylint` accepts the following values:

- a symbolic message: `no-member`, `undefined-variable` etc.
- a numerical ID: `E1101`, `E1102` etc.
- The name of the group of checks. You can grab those with `pylint --list-groups`. For example, you can disable / enable all the checks related to type checking, with `typecheck` or all the checks related to variables with `variables`
- Corresponding category of the checks
  - `C` convention related checks
  - `R` refactoring related checks
  - `W` various warnings
  - `E` errors, for probable bugs in the code
  - `F` fatal, if an error occurred which prevented `pylint` from doing further processing.
- All the checks with `all`

## Block disables

This describes how the pragma controls operate at a code level.

The pragma controls can disable / enable:

- All the violations on a single line

  >     a, b = ... # pylint: disable=unbalanced-tuple-unpacking

- All the violations in a single scope

  >     def test():
  >         # Disable all the no-member violations in this function
  >         # pylint: disable=no-member
  >         ...

- All the violations in a block. For instance, each separate branch of an `if` statement is considered a separate block, as in the following example:

  >     def meth5(self):
  >         # pylint: disable=no-member
  >         # no error
  >         print(self.bla)
  >         if self.blop:
  >             # pylint: enable=no-member
  >             # disable all no-members for this block
  >             print(self.blip)
  >         else:
  >             # This is affected by the scope disable
  >             print(self.blip)
  >         # pylint: enable=no-member
  >         print(self.blip)
  >         if self.blop:
  >             # pylint: enable=no-member
  >             # disable all no-members for this block
  >             print(self.blip)
  >         else:
  >             # This emits a violation
  >             print(self.blip)

- If the violation occurs on a block starting line, then it applies only to that line

  >     if self.blop: # pylint: disable=no-member; applies only to this line
  >         # Here we get an error
  >         print(self.blip)
  >     else:
  >         # error
  >         print(self.blip)

Here's an example with all these rules in a single place:

    """pylint option block-disable"""

    __revision__ = None

    class Foo(object):
        """block-disable test"""

        def __init__(self):
            pass

        def meth1(self, arg):
            """this issues a message"""
            print(self)

        def meth2(self, arg):
            """and this one not"""
            # pylint: disable=unused-argument
            print(self\
                  + "foo")

        def meth3(self):
            """test one line disabling"""
            # no error
            print(self.bla) # pylint: disable=no-member
            # error
            print(self.blop)

        def meth4(self):
            """test re-enabling"""
            # pylint: disable=no-member
            # no error
            print(self.bla)
            print(self.blop)
            # pylint: enable=no-member
            # error
            print(self.blip)

        def meth5(self):
            """test IF sub-block re-enabling"""
            # pylint: disable=no-member
            # no error
            print(self.bla)
            if self.blop:
                # pylint: enable=no-member
                # error
                print(self.blip)
            else:
                # no error
                print(self.blip)
            # no error
            print(self.blip)

        def meth6(self):
            """test TRY/EXCEPT sub-block re-enabling"""
            # pylint: disable=no-member
            # no error
            print(self.bla)
            try:
                # pylint: enable=no-member
                # error
                print(self.blip)
            except UndefinedName: # pylint: disable=undefined-variable
                # no error
                print(self.blip)
            # no error
            print(self.blip)

        def meth7(self):
            """test one line block opening disabling"""
            if self.blop: # pylint: disable=no-member
                # error
                print(self.blip)
            else:
                # error
                print(self.blip)
            # error
            print(self.blip)

        def meth8(self):
            """test late disabling"""
            # error
            print(self.blip)
            # pylint: disable=no-member
            # no error
            print(self.bla)
            print(self.blop)