diff options
Diffstat (limited to 'tests/functional/u/unbalanced/unbalanced_tuple_unpacking.py')
-rw-r--r-- | tests/functional/u/unbalanced/unbalanced_tuple_unpacking.py | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/tests/functional/u/unbalanced/unbalanced_tuple_unpacking.py b/tests/functional/u/unbalanced/unbalanced_tuple_unpacking.py new file mode 100644 index 000000000..21e497be8 --- /dev/null +++ b/tests/functional/u/unbalanced/unbalanced_tuple_unpacking.py @@ -0,0 +1,162 @@ +"""Check possible unbalanced tuple unpacking """ +from __future__ import absolute_import +from typing import NamedTuple +from functional.u.unpacking.unpacking import unpack + +# pylint: disable=missing-class-docstring, missing-function-docstring, using-constant-test, import-outside-toplevel + + +def do_stuff(): + """This is not right.""" + first, second = 1, 2, 3 # [unbalanced-tuple-unpacking] + return first + second + + +def do_stuff1(): + """This is not right.""" + first, second = [1, 2, 3] # [unbalanced-tuple-unpacking] + return first + second + + +def do_stuff2(): + """This is not right.""" + (first, second) = 1, 2, 3 # [unbalanced-tuple-unpacking] + return first + second + + +def do_stuff3(): + """This is not right.""" + first, second = range(100) + return first + second + + +def do_stuff4(): + """This is right""" + first, second = 1, 2 + return first + second + + +def do_stuff5(): + """This is also right""" + first, second = (1, 2) + return first + second + + +def do_stuff6(): + """This is right""" + (first, second) = (1, 2) + return first + second + + +def temp(): + """This is not weird""" + if True: + return [1, 2] + return [2, 3, 4] + + +def do_stuff7(): + """This is not right, but we're not sure""" + first, second = temp() + return first + second + + +def temp2(): + """This is weird, but correct""" + if True: + return (1, 2) + + if True: + return (2, 3) + return (4, 5) + + +def do_stuff8(): + """This is correct""" + first, second = temp2() + return first + second + + +def do_stuff9(): + """This is not correct""" + first, second = unpack() # [unbalanced-tuple-unpacking] + return first + second + + +class UnbalancedUnpacking: + """Test unbalanced tuple unpacking in instance attributes.""" + + # pylint: disable=attribute-defined-outside-init, invalid-name, too-few-public-methods + def test(self): + """unpacking in instance attributes""" + # we're not sure if temp() returns two or three values + # so we shouldn't emit an error + self.a, self.b = temp() + self.a, self.b = temp2() + self.a, self.b = unpack() # [unbalanced-tuple-unpacking] + + +def issue329(*args): + """Don't emit unbalanced tuple unpacking if the + rhs of the assignment is a variable-length argument, + because we don't know the actual length of the tuple. + """ + first, second, third = args + return first, second, third + + +def test_decimal(): + """Test a false positive with decimal.Decimal.as_tuple + + See astroid https://bitbucket.org/logilab/astroid/issues/92/ + """ + from decimal import Decimal + + dec = Decimal(2) + first, second, third = dec.as_tuple() + return first, second, third + + +def test_issue_559(): + """Test that we don't have a false positive wrt to issue #559.""" + from ctypes import c_int + + root_x, root_y, win_x, win_y = [c_int()] * 4 + return root_x, root_y, win_x, win_y + + +class MyClass(NamedTuple): + first: float + second: float + third: float = 1.0 + + def my_sum(self): + """Unpack 3 variables""" + first, second, third = self + return first + second + third + + def sum_unpack_3_into_4(self): + """Attempt to unpack 3 variables into 4""" + first, second, third, fourth = self # [unbalanced-tuple-unpacking] + return first + second + third + fourth + + def sum_unpack_3_into_2(self): + """Attempt to unpack 3 variables into 2""" + first, second = self # [unbalanced-tuple-unpacking] + return first + second + + +def my_function(mystring): + """The number of items on the right-hand-side of the assignment to this function is not known""" + mylist = [] + for item in mystring: + mylist.append(item) + return mylist + + +a, b = my_function("12") # [unbalanced-tuple-unpacking] +c = my_function("12") +d, *_ = my_function("12") + +# https://github.com/pylint-dev/pylint/issues/5998 +x, y, z = (1, 2) # [unbalanced-tuple-unpacking] |