From 106f6f7f5acafd1668eb5587893a552b342b4c0a Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Sat, 12 Dec 2015 04:16:49 +0100 Subject: [PATCH] too many values and too few values errors implemented for list comprehensions tuple unpacking. --- jedi/evaluate/analysis.py | 2 ++ jedi/evaluate/iterable.py | 10 +++++++--- test/static_analysis/comprehensions.py | 11 +++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/jedi/evaluate/analysis.py b/jedi/evaluate/analysis.py index 4a85507c..d0ed42bf 100644 --- a/jedi/evaluate/analysis.py +++ b/jedi/evaluate/analysis.py @@ -22,6 +22,8 @@ CODES = { 'type-error-not-iterable': (11, TypeError, None), 'type-error-isinstance': (12, TypeError, None), 'type-error-not-subscriptable': (13, TypeError, None), + 'value-error-too-many-values': (13, ValueError, None), + 'value-error-too-few-values': (13, ValueError, None), } diff --git a/jedi/evaluate/iterable.py b/jedi/evaluate/iterable.py index b5352cd0..48f7058c 100644 --- a/jedi/evaluate/iterable.py +++ b/jedi/evaluate/iterable.py @@ -392,16 +392,20 @@ def unpack_tuple_to_dict(evaluator, types, exprlist): 'testlist_star_expr'): dct = {} parts = iter(exprlist.children[::2]) - for iter_types in py__iter__(evaluator, types, exprlist): + n = 1 + for iter_types in enumerate(py__iter__(evaluator, types, exprlist)): + n += 1 try: part = next(parts) except StopIteration: - raise NotImplementedError + analysis.add(evaluator, 'value-error-too-many-values', part, + message="ValueError: too many values to unpack (expected %s)" % n) else: dct.update(unpack_tuple_to_dict(evaluator, iter_types, part)) has_parts = next(parts, None) if has_parts is not None: - raise NotImplementedError + analysis.add(evaluator, 'value-error-too-few-values', has_parts, + message="ValueError: need more than %s values to unpack" % n) return dct elif exprlist.type == 'power': # Something like ``arr[x], var = ...``. diff --git a/test/static_analysis/comprehensions.py b/test/static_analysis/comprehensions.py index 36c60e37..4af799d8 100644 --- a/test/static_analysis/comprehensions.py +++ b/test/static_analysis/comprehensions.py @@ -28,3 +28,14 @@ tuple(a + 3 for a in ['']) #! 19 name-error (1 for a in [1] if NOT_DEFINED) + +# ---------- +# unbalanced sides. +# ---------- + +# ok +(1 for a, b in [(1, 2)]) +#! 13 value-error-too-few-values +(1 for a, b, c in [(1, 2)]) +#! 10 value-error-too-many-values +(1 for a, b in [(1, 2, 3)])