From 3263f04072140f7fc2c3e87dae127e7bd146a136 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabi=C3=A1n=20Heredia=20Montiel?= Date: Mon, 18 Jul 2016 23:28:43 -0500 Subject: [PATCH 1/2] Fixes #1717 by skiping the `%%` literal in parse_conversion_specifiers. --- mypy/checkstrformat.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mypy/checkstrformat.py b/mypy/checkstrformat.py index 0ff81fb1ea58..73cfe251cd58 100644 --- a/mypy/checkstrformat.py +++ b/mypy/checkstrformat.py @@ -78,7 +78,11 @@ def parse_conversion_specifiers(self, format: str) -> List[ConversionSpecifier]: regex = ('%' + key_regex + flags_regex + width_regex + precision_regex + length_mod_regex + type_regex) specifiers = [] # type: List[ConversionSpecifier] - for parens_key, key, flags, width, precision, type in re.findall(regex, format): + for result in re.findall(regex, format): + # The following test gets rid of the `%%` literal. + if result == ('', '', '', '', '', '%'): + continue + parens_key, key, flags, width, precision, type = result if parens_key == '': key = None specifiers.append(ConversionSpecifier(key, flags, width, precision, type)) From 07169a3fe1a6fe35afbf7c7c3ce2bb59dc4acdeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabi=C3=A1n=20Heredia=20Montiel?= Date: Mon, 18 Jul 2016 23:45:16 -0500 Subject: [PATCH 2/2] Add test case from #1900 about #1717 --- test-data/unit/check-expressions.test | 1 + 1 file changed, 1 insertion(+) diff --git a/test-data/unit/check-expressions.test b/test-data/unit/check-expressions.test index e80de39763d6..53702624d63f 100644 --- a/test-data/unit/check-expressions.test +++ b/test-data/unit/check-expressions.test @@ -971,6 +971,7 @@ a = None # type: Any '%3% %d' % 1 '%*%' % 1 '%*% %d' % 1 # E: Not enough arguments for format string +'%(a)d %%' % {'a': 1} [builtins fixtures/primitives.py] [case testStringInterpolationC]