.. _CollapseIsinstanceChecksRule:

============================
CollapseIsinstanceChecksRule
============================

The built-in ``isinstance`` function, instead of a single type,
can take a tuple of types and check whether given target suits
any of them. Rather than chaining multiple ``isinstance`` calls
with a boolean-or operation, a single ``isinstance`` call where
the second argument is a tuple of all types can be used.

-------
Message
-------
Multiple isinstance calls with the same target but different types can be collapsed into a single call with a tuple of types.

----------------
Has Autofix: Yes
----------------

-------------------
VALID Code Examples
-------------------

# 1:







.. code-block:: python

            foo() or foo()




# 2:







.. code-block:: python

            foo(x, y) or foo(x, z)




# 3:







.. code-block:: python

            foo(x, y) or foo(x, z) or foo(x, q)




.. container:: toggle


    # 4:







    .. code-block:: python

                isinstance() or isinstance()





    # 5:







    .. code-block:: python

                isinstance(x) or isinstance(x)





    # 6:







    .. code-block:: python

                isinstance(x, y) or isinstance(x)





    # 7:







    .. code-block:: python

                isinstance(x) or isinstance(x, y)





    # 8:







    .. code-block:: python

                isinstance(x, y) or isinstance(t, y)





    # 9:







    .. code-block:: python

                isinstance(x, y) and isinstance(x, z)





    # 10:







    .. code-block:: python

                isinstance(x, y) or isinstance(x, (z, q))





    # 11:







    .. code-block:: python

                isinstance(x, (y, z)) or isinstance(x, q)





    # 12:







    .. code-block:: python

                isinstance(x, a) or isinstance(y, b) or isinstance(z, c)





    # 13:







    .. code-block:: python


        def foo():
            def isinstance(x, y):
                return _foo_bar(x, y)
            if isinstance(x, y) or isinstance(x, z):
                print("foo")






---------------------
INVALID Code Examples
---------------------

# 1:







.. code-block:: python

            isinstance(x, y) or isinstance(x, z)




Autofix:

.. code-block:: python

    --- 
    +++ 
    @@ -1 +1 @@
    -isinstance(x, y) or isinstance(x, z)
    +isinstance(x, (y, z))

# 2:







.. code-block:: python

            isinstance(x, y) or isinstance(x, z) or isinstance(x, q)




Autofix:

.. code-block:: python

    --- 
    +++ 
    @@ -1 +1 @@
    -isinstance(x, y) or isinstance(x, z) or isinstance(x, q)
    +isinstance(x, (y, z, q))

# 3:







.. code-block:: python

            something or isinstance(x, y) or isinstance(x, z) or another




Autofix:

.. code-block:: python

    --- 
    +++ 
    @@ -1 +1 @@
    -something or isinstance(x, y) or isinstance(x, z) or another
    +something or isinstance(x, (y, z)) or another

.. container:: toggle


    # 4:







    .. code-block:: python

                isinstance(x, y) or isinstance(x, z) or isinstance(x, q) or isinstance(x, w)




    Autofix:

    .. code-block:: python

        --- 
        +++ 
        @@ -1 +1 @@
        -isinstance(x, y) or isinstance(x, z) or isinstance(x, q) or isinstance(x, w)
        +isinstance(x, (y, z, q, w))


    # 5:







    .. code-block:: python

                isinstance(x, a) or isinstance(x, b) or isinstance(y, c) or isinstance(y, d)




    Autofix:

    .. code-block:: python

        --- 
        +++ 
        @@ -1 +1 @@
        -isinstance(x, a) or isinstance(x, b) or isinstance(y, c) or isinstance(y, d)
        +isinstance(x, (a, b)) or isinstance(y, (c, d))


    # 6:







    .. code-block:: python

                isinstance(x, a) or isinstance(x, b) or isinstance(y, c) or isinstance(y, d) or isinstance(z, e)




    Autofix:

    .. code-block:: python

        --- 
        +++ 
        @@ -1 +1 @@
        -isinstance(x, a) or isinstance(x, b) or isinstance(y, c) or isinstance(y, d) or isinstance(z, e)
        +isinstance(x, (a, b)) or isinstance(y, (c, d)) or isinstance(z, e)


    # 7:







    .. code-block:: python

                isinstance(x, a) or isinstance(x, b) or isinstance(y, c) or isinstance(y, d) or isinstance(z, e) or isinstance(q, f) or isinstance(q, g) or isinstance(q, h)




    Autofix:

    .. code-block:: python

        --- 
        +++ 
        @@ -1 +1 @@
        -isinstance(x, a) or isinstance(x, b) or isinstance(y, c) or isinstance(y, d) or isinstance(z, e) or isinstance(q, f) or isinstance(q, g) or isinstance(q, h)
        +isinstance(x, (a, b)) or isinstance(y, (c, d)) or isinstance(z, e) or isinstance(q, (f, g, h))

