1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
"""Check possible unbalanced tuple unpacking """
from __future__ import absolute_import
from functional.u.unpacking import unpack
# pylint: disable=using-constant-test, useless-object-inheritance
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(object):
""" 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
|