diff --git a/NEWS.rst b/NEWS.rst
index 8bf9023..993a545 100644
--- a/NEWS.rst
+++ b/NEWS.rst
@@ -1,3 +1,7 @@
+2.1.1 (2019-02-28)
+- Fix reported line number for type comment errors
+- Fix typing.overload check to only check imported names
+
 2.1.0 (2019-01-23)
 
 - Allow intentional assignment to variables named ``_``
diff --git a/README.rst b/README.rst
index 4b1d3c2..ca802a8 100644
--- a/README.rst
+++ b/README.rst
@@ -86,4 +86,4 @@ All changes should include tests and pass flake8_.
 Changelog
 ---------
 
-Please see `NEWS.rst <NEWS.rst>`_.
+Please see `NEWS.rst <https://github.com/PyCQA/pyflakes/blob/master/NEWS.rst>`_.
diff --git a/pyflakes/__init__.py b/pyflakes/__init__.py
index a33997d..55fa725 100644
--- a/pyflakes/__init__.py
+++ b/pyflakes/__init__.py
@@ -1,1 +1,1 @@
-__version__ = '2.1.0'
+__version__ = '2.1.1'
diff --git a/pyflakes/checker.py b/pyflakes/checker.py
index 83f92aa..f9ae0aa 100644
--- a/pyflakes/checker.py
+++ b/pyflakes/checker.py
@@ -12,6 +12,7 @@ import doctest
 import functools
 import os
 import re
+import string
 import sys
 import tokenize
 
@@ -29,6 +30,8 @@ except AttributeError:
 
 builtin_vars = dir(__import__('__builtin__' if PY2 else 'builtins'))
 
+parse_format_string = string.Formatter().parse
+
 if PY2:
     tokenize_tokenize = tokenize.generate_tokens
 else:
@@ -81,6 +84,87 @@ TYPE_IGNORE_RE = re.compile(TYPE_COMMENT_RE.pattern + r'ignore\s*(#|$)')
 TYPE_FUNC_RE = re.compile(r'^(\(.*?\))\s*->\s*(.*)$')
 
 
+MAPPING_KEY_RE = re.compile(r'\(([^()]*)\)')
+CONVERSION_FLAG_RE = re.compile('[#0+ -]*')
+WIDTH_RE = re.compile(r'(?:\*|\d*)')
+PRECISION_RE = re.compile(r'(?:\.(?:\*|\d*))?')
+LENGTH_RE = re.compile('[hlL]?')
+# https://docs.python.org/3/library/stdtypes.html#old-string-formatting
+VALID_CONVERSIONS = frozenset('diouxXeEfFgGcrsa%')
+
+
+def _must_match(regex, string, pos):
+    # type: (Pattern[str], str, int) -> Match[str]
+    match = regex.match(string, pos)
+    assert match is not None
+    return match
+
+
+def parse_percent_format(s):  # type: (str) -> Tuple[PercentFormat, ...]
+    """Parses the string component of a `'...' % ...` format call
+
+    Copied from https://github.com/asottile/pyupgrade at v1.20.1
+    """
+
+    def _parse_inner():
+        # type: () -> Generator[PercentFormat, None, None]
+        string_start = 0
+        string_end = 0
+        in_fmt = False
+
+        i = 0
+        while i < len(s):
+            if not in_fmt:
+                try:
+                    i = s.index('%', i)
+                except ValueError:  # no more % fields!
+                    yield s[string_start:], None
+                    return
+                else:
+                    string_end = i
+                    i += 1
+                    in_fmt = True
+            else:
+                key_match = MAPPING_KEY_RE.match(s, i)
+                if key_match:
+                    key = key_match.group(1)  # type: Optional[str]
+                    i = key_match.end()
+                else:
+                    key = None
+
+                conversion_flag_match = _must_match(CONVERSION_FLAG_RE, s, i)
+                conversion_flag = conversion_flag_match.group() or None
+                i = conversion_flag_match.end()
+
+                width_match = _must_match(WIDTH_RE, s, i)
+                width = width_match.group() or None
+                i = width_match.end()
+
+                precision_match = _must_match(PRECISION_RE, s, i)
+                precision = precision_match.group() or None
+                i = precision_match.end()
+
+                # length modifier is ignored
+                i = _must_match(LENGTH_RE, s, i).end()
+
+                try:
+                    conversion = s[i]
+                except IndexError:
+                    raise ValueError('end-of-string while parsing format')
+                i += 1
+
+                fmt = (key, conversion_flag, width, precision, conversion)
+                yield s[string_start:string_end], fmt
+
+                in_fmt = False
+                string_start = i
+
+        if in_fmt:
+            raise ValueError('end-of-string while parsing format')
+
+    return tuple(_parse_inner())
+
+
 class _FieldsOrder(dict):
     """Fix order of AST node fields."""
 
@@ -822,22 +906,31 @@ class Checker(object):
     def getParent(self, node):
         # Lookup the first parent which is not Tuple, List or Starred
         while True:
-            node = node.parent
+            node = node._pyflakes_parent
             if not hasattr(node, 'elts') and not hasattr(node, 'ctx'):
                 return node
 
     def getCommonAncestor(self, lnode, rnode, stop):
-        if stop in (lnode, rnode) or not (hasattr(lnode, 'parent') and
-                                          hasattr(rnode, 'parent')):
+        if (
+                stop in (lnode, rnode) or
+                not (
+                    hasattr(lnode, '_pyflakes_parent') and
+                    hasattr(rnode, '_pyflakes_parent')
+                )
+        ):
             return None
         if lnode is rnode:
             return lnode
 
-        if (lnode.depth > rnode.depth):
-            return self.getCommonAncestor(lnode.parent, rnode, stop)
-        if (lnode.depth < rnode.depth):
-            return self.getCommonAncestor(lnode, rnode.parent, stop)
-        return self.getCommonAncestor(lnode.parent, rnode.parent, stop)
+        if (lnode._pyflakes_depth > rnode._pyflakes_depth):
+            return self.getCommonAncestor(lnode._pyflakes_parent, rnode, stop)
+        if (lnode._pyflakes_depth < rnode._pyflakes_depth):
+            return self.getCommonAncestor(lnode, rnode._pyflakes_parent, stop)
+        return self.getCommonAncestor(
+            lnode._pyflakes_parent,
+            rnode._pyflakes_parent,
+            stop,
+        )
 
     def descendantOf(self, node, ancestors, stop):
         for a in ancestors:
@@ -875,7 +968,7 @@ class Checker(object):
         - `node` is the statement responsible for the change
         - `value` is the new value, a Binding instance
         """
-        # assert value.source in (node, node.parent):
+        # assert value.source in (node, node._pyflakes_parent):
         for scope in self.scopeStack[::-1]:
             if value.name in scope:
                 break
@@ -1014,11 +1107,11 @@ class Checker(object):
 
         parent_stmt = self.getParent(node)
         if isinstance(parent_stmt, (FOR_TYPES, ast.comprehension)) or (
-                parent_stmt != node.parent and
+                parent_stmt != node._pyflakes_parent and
                 not self.isLiteralTupleUnpacking(parent_stmt)):
             binding = Binding(name, node)
         elif name == '__all__' and isinstance(self.scope, ModuleScope):
-            binding = ExportBinding(name, node.parent, self.scope)
+            binding = ExportBinding(name, node._pyflakes_parent, self.scope)
         elif isinstance(getattr(node, 'ctx', None), ast.Param):
             binding = Argument(name, self.getScopeNode(node))
         else:
@@ -1031,11 +1124,11 @@ class Checker(object):
             """
             Return `True` if node is part of a conditional body.
             """
-            current = getattr(node, 'parent', None)
+            current = getattr(node, '_pyflakes_parent', None)
             while current:
                 if isinstance(current, (ast.If, ast.While, ast.IfExp)):
                     return True
-                current = getattr(current, 'parent', None)
+                current = getattr(current, '_pyflakes_parent', None)
             return False
 
         name = getNodeName(node)
@@ -1122,8 +1215,8 @@ class Checker(object):
                                         self.isDocstring(node)):
             self.futuresAllowed = False
         self.nodeDepth += 1
-        node.depth = self.nodeDepth
-        node.parent = parent
+        node._pyflakes_depth = self.nodeDepth
+        node._pyflakes_parent = parent
         try:
             handler = self.getNodeHandler(node.__class__)
             handler(node)
@@ -1162,7 +1255,8 @@ class Checker(object):
         self.scopeStack = [self.scopeStack[0]]
         node_offset = self.offset or (0, 0)
         self.pushScope(DoctestScope)
-        self.addBinding(None, Builtin('_'))
+        if '_' not in self.scopeStack[0]:
+            self.addBinding(None, Builtin('_'))
         for example in examples:
             try:
                 tree = ast.parse(example.source, "<doctest>")
@@ -1231,10 +1325,250 @@ class Checker(object):
     PASS = ignore
 
     # "expr" type nodes
-    BOOLOP = BINOP = UNARYOP = IFEXP = SET = \
-        CALL = REPR = ATTRIBUTE = SUBSCRIPT = \
+    BOOLOP = UNARYOP = IFEXP = SET = \
+        REPR = ATTRIBUTE = SUBSCRIPT = \
         STARRED = NAMECONSTANT = handleChildren
 
+    def _handle_string_dot_format(self, node):
+        try:
+            placeholders = tuple(parse_format_string(node.func.value.s))
+        except ValueError as e:
+            self.report(messages.StringDotFormatInvalidFormat, node, e)
+            return
+
+        class state:  # py2-compatible `nonlocal`
+            auto = None
+            next_auto = 0
+
+        placeholder_positional = set()
+        placeholder_named = set()
+
+        def _add_key(fmtkey):
+            """Returns True if there is an error which should early-exit"""
+            if fmtkey is None:  # end of string or `{` / `}` escapes
+                return False
+
+            # attributes / indices are allowed in `.format(...)`
+            fmtkey, _, _ = fmtkey.partition('.')
+            fmtkey, _, _ = fmtkey.partition('[')
+
+            try:
+                fmtkey = int(fmtkey)
+            except ValueError:
+                pass
+            else:  # fmtkey was an integer
+                if state.auto is True:
+                    self.report(messages.StringDotFormatMixingAutomatic, node)
+                    return True
+                else:
+                    state.auto = False
+
+            if fmtkey == '':
+                if state.auto is False:
+                    self.report(messages.StringDotFormatMixingAutomatic, node)
+                    return True
+                else:
+                    state.auto = True
+
+                fmtkey = state.next_auto
+                state.next_auto += 1
+
+            if isinstance(fmtkey, int):
+                placeholder_positional.add(fmtkey)
+            else:
+                placeholder_named.add(fmtkey)
+
+            return False
+
+        for _, fmtkey, spec, _ in placeholders:
+            if _add_key(fmtkey):
+                return
+
+            # spec can also contain format specifiers
+            if spec is not None:
+                try:
+                    spec_placeholders = tuple(parse_format_string(spec))
+                except ValueError as e:
+                    self.report(messages.StringDotFormatInvalidFormat, node, e)
+                    return
+
+                for _, spec_fmtkey, spec_spec, _ in spec_placeholders:
+                    # can't recurse again
+                    if spec_spec is not None and '{' in spec_spec:
+                        self.report(
+                            messages.StringDotFormatInvalidFormat,
+                            node,
+                            'Max string recursion exceeded',
+                        )
+                        return
+                    if _add_key(spec_fmtkey):
+                        return
+
+        # bail early if there is *args or **kwargs
+        if (
+                # python 2.x *args / **kwargs
+                getattr(node, 'starargs', None) or
+                getattr(node, 'kwargs', None) or
+                # python 3.x *args
+                any(
+                    isinstance(arg, getattr(ast, 'Starred', ()))
+                    for arg in node.args
+                ) or
+                # python 3.x **kwargs
+                any(kwd.arg is None for kwd in node.keywords)
+        ):
+            return
+
+        substitution_positional = set(range(len(node.args)))
+        substitution_named = {kwd.arg for kwd in node.keywords}
+
+        extra_positional = substitution_positional - placeholder_positional
+        extra_named = substitution_named - placeholder_named
+
+        missing_arguments = (
+            (placeholder_positional | placeholder_named) -
+            (substitution_positional | substitution_named)
+        )
+
+        if extra_positional:
+            self.report(
+                messages.StringDotFormatExtraPositionalArguments,
+                node,
+                ', '.join(sorted(str(x) for x in extra_positional)),
+            )
+        if extra_named:
+            self.report(
+                messages.StringDotFormatExtraNamedArguments,
+                node,
+                ', '.join(sorted(extra_named)),
+            )
+        if missing_arguments:
+            self.report(
+                messages.StringDotFormatMissingArgument,
+                node,
+                ', '.join(sorted(str(x) for x in missing_arguments)),
+            )
+
+    def CALL(self, node):
+        if (
+                isinstance(node.func, ast.Attribute) and
+                isinstance(node.func.value, ast.Str) and
+                node.func.attr == 'format'
+        ):
+            self._handle_string_dot_format(node)
+        self.handleChildren(node)
+
+    def _handle_percent_format(self, node):
+        try:
+            placeholders = parse_percent_format(node.left.s)
+        except ValueError:
+            self.report(
+                messages.PercentFormatInvalidFormat,
+                node,
+                'incomplete format',
+            )
+            return
+
+        named = set()
+        positional_count = 0
+        positional = None
+        for _, placeholder in placeholders:
+            if placeholder is None:
+                continue
+            name, _, width, precision, conversion = placeholder
+
+            if conversion == '%':
+                continue
+
+            if conversion not in VALID_CONVERSIONS:
+                self.report(
+                    messages.PercentFormatUnsupportedFormatCharacter,
+                    node,
+                    conversion,
+                )
+
+            if positional is None and conversion:
+                positional = name is None
+
+            for part in (width, precision):
+                if part is not None and '*' in part:
+                    if not positional:
+                        self.report(
+                            messages.PercentFormatStarRequiresSequence,
+                            node,
+                        )
+                    else:
+                        positional_count += 1
+
+            if positional and name is not None:
+                self.report(
+                    messages.PercentFormatMixedPositionalAndNamed,
+                    node,
+                )
+                return
+            elif not positional and name is None:
+                self.report(
+                    messages.PercentFormatMixedPositionalAndNamed,
+                    node,
+                )
+                return
+
+            if positional:
+                positional_count += 1
+            else:
+                named.add(name)
+
+        if (
+                isinstance(node.right, (ast.List, ast.Tuple)) and
+                # does not have any *splats (py35+ feature)
+                not any(
+                    isinstance(elt, getattr(ast, 'Starred', ()))
+                    for elt in node.right.elts
+                )
+        ):
+            substitution_count = len(node.right.elts)
+            if positional and positional_count != substitution_count:
+                self.report(
+                    messages.PercentFormatPositionalCountMismatch,
+                    node,
+                    positional_count,
+                    substitution_count,
+                )
+            elif not positional:
+                self.report(messages.PercentFormatExpectedMapping, node)
+
+        if (
+                isinstance(node.right, ast.Dict) and
+                all(isinstance(k, ast.Str) for k in node.right.keys)
+        ):
+            if positional and positional_count > 1:
+                self.report(messages.PercentFormatExpectedSequence, node)
+                return
+
+            substitution_keys = {k.s for k in node.right.keys}
+            extra_keys = substitution_keys - named
+            missing_keys = named - substitution_keys
+            if not positional and extra_keys:
+                self.report(
+                    messages.PercentFormatExtraNamedArguments,
+                    node,
+                    ', '.join(sorted(extra_keys)),
+                )
+            if not positional and missing_keys:
+                self.report(
+                    messages.PercentFormatMissingArgument,
+                    node,
+                    ', '.join(sorted(missing_keys)),
+                )
+
+    def BINOP(self, node):
+        if (
+                isinstance(node.op, ast.Mod) and
+                isinstance(node.left, ast.Str)
+        ):
+            self._handle_percent_format(node)
+        self.handleChildren(node)
+
     NUM = STR = BYTES = ELLIPSIS = CONSTANT = ignore
 
     # "slice" type nodes
@@ -1263,7 +1597,24 @@ class Checker(object):
             self.report(messages.RaiseNotImplemented, node)
 
     # additional node types
-    COMPREHENSION = KEYWORD = FORMATTEDVALUE = JOINEDSTR = handleChildren
+    COMPREHENSION = KEYWORD = FORMATTEDVALUE = handleChildren
+
+    _in_fstring = False
+
+    def JOINEDSTR(self, node):
+        if (
+                # the conversion / etc. flags are parsed as f-strings without
+                # placeholders
+                not self._in_fstring and
+                not any(isinstance(x, ast.FormattedValue) for x in node.values)
+        ):
+            self.report(messages.FStringMissingPlaceholders, node)
+
+        self._in_fstring, orig = True, self._in_fstring
+        try:
+            self.handleChildren(node)
+        finally:
+            self._in_fstring = orig
 
     def DICT(self, node):
         # Complain if there are duplicate keys with different values
@@ -1355,7 +1706,7 @@ class Checker(object):
         if isinstance(node.ctx, (ast.Load, ast.AugLoad)):
             self.handleNodeLoad(node)
             if (node.id == 'locals' and isinstance(self.scope, FunctionScope) and
-                    isinstance(node.parent, ast.Call)):
+                    isinstance(node._pyflakes_parent, ast.Call)):
                 # we are doing locals() call in current scope
                 self.scope.usesLocals = True
         elif isinstance(node.ctx, (ast.Store, ast.AugStore, ast.Param)):
@@ -1371,8 +1722,8 @@ class Checker(object):
         # definition (not OK), for 'continue', a finally block (not OK), or
         # the top module scope (not OK)
         n = node
-        while hasattr(n, 'parent'):
-            n, n_child = n.parent, n
+        while hasattr(n, '_pyflakes_parent'):
+            n, n_child = n._pyflakes_parent, n
             if isinstance(n, LOOP_TYPES):
                 # Doesn't apply unless it's in the loop itself
                 if n_child not in n.orelse:
diff --git a/pyflakes/messages.py b/pyflakes/messages.py
index 8ae545f..cf67cf8 100644
--- a/pyflakes/messages.py
+++ b/pyflakes/messages.py
@@ -266,3 +266,99 @@ class InvalidPrintSyntax(Message):
 
 class IsLiteral(Message):
     message = 'use ==/!= to compare str, bytes, and int literals'
+
+
+class FStringMissingPlaceholders(Message):
+    message = 'f-string is missing placeholders'
+
+
+class StringDotFormatExtraPositionalArguments(Message):
+    message = "'...'.format(...) has unused arguments at position(s): %s"
+
+    def __init__(self, filename, loc, extra_positions):
+        Message.__init__(self, filename, loc)
+        self.message_args = (extra_positions,)
+
+
+class StringDotFormatExtraNamedArguments(Message):
+    message = "'...'.format(...) has unused named argument(s): %s"
+
+    def __init__(self, filename, loc, extra_keywords):
+        Message.__init__(self, filename, loc)
+        self.message_args = (extra_keywords,)
+
+
+class StringDotFormatMissingArgument(Message):
+    message = "'...'.format(...) is missing argument(s) for placeholder(s): %s"
+
+    def __init__(self, filename, loc, missing_arguments):
+        Message.__init__(self, filename, loc)
+        self.message_args = (missing_arguments,)
+
+
+class StringDotFormatMixingAutomatic(Message):
+    message = "'...'.format(...) mixes automatic and manual numbering"
+
+
+class StringDotFormatInvalidFormat(Message):
+    message = "'...'.format(...) has invalid format string: %s"
+
+    def __init__(self, filename, loc, error):
+        Message.__init__(self, filename, loc)
+        self.message_args = (error,)
+
+
+class PercentFormatInvalidFormat(Message):
+    message = "'...' %% ... has invalid format string: %s"
+
+    def __init__(self, filename, loc, error):
+        Message.__init__(self, filename, loc)
+        self.message_args = (error,)
+
+
+class PercentFormatMixedPositionalAndNamed(Message):
+    message = "'...' %% ... has mixed positional and named placeholders"
+
+
+class PercentFormatUnsupportedFormatCharacter(Message):
+    message = "'...' %% ... has unsupported format character %r"
+
+    def __init__(self, filename, loc, c):
+        Message.__init__(self, filename, loc)
+        self.message_args = (c,)
+
+
+class PercentFormatPositionalCountMismatch(Message):
+    message = "'...' %% ... has %d placeholder(s) but %d substitution(s)"
+
+    def __init__(self, filename, loc, n_placeholders, n_substitutions):
+        Message.__init__(self, filename, loc)
+        self.message_args = (n_placeholders, n_substitutions)
+
+
+class PercentFormatExtraNamedArguments(Message):
+    message = "'...' %% ... has unused named argument(s): %s"
+
+    def __init__(self, filename, loc, extra_keywords):
+        Message.__init__(self, filename, loc)
+        self.message_args = (extra_keywords,)
+
+
+class PercentFormatMissingArgument(Message):
+    message = "'...' %% ... is missing argument(s) for placeholder(s): %s"
+
+    def __init__(self, filename, loc, missing_arguments):
+        Message.__init__(self, filename, loc)
+        self.message_args = (missing_arguments,)
+
+
+class PercentFormatExpectedMapping(Message):
+    message = "'...' %% ... expected mapping but got sequence"
+
+
+class PercentFormatExpectedSequence(Message):
+    message = "'...' %% ... expected sequence but got mapping"
+
+
+class PercentFormatStarRequiresSequence(Message):
+    message = "'...' %% ... `*` specifier requires sequence"

Detect broken string templates that will raise ValueError when interpolated

*Original report by [jkakar](https://launchpad.net/~jkakar) (@jkakar?) on [Launchpad](https://bugs.launchpad.net/bugs/950369):*

------------------------------------

For example, code like this will break:

  >>> "%(foo)" % {"foo": "bar"}
  Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
  ValueError: incomplete format

It'd be awesome if Pyflakes told me about that kind of issue.

diff --git a/pyflakes/test/test_doctests.py b/pyflakes/test/test_doctests.py
index 0825ffe..5565226 100644
--- a/pyflakes/test/test_doctests.py
+++ b/pyflakes/test/test_doctests.py
@@ -433,6 +433,16 @@ class Test(TestCase):
             return 1
         ''')
 
+    def test_globalUnderscoreInDoctest(self):
+        self.flakes("""
+        from gettext import ugettext as _
+
+        def doctest_stuff():
+            '''
+                >>> pass
+            '''
+        """, m.UnusedImport)
+
 
 class TestOther(_DoctestMixin, TestOther):
     """Run TestOther with each test wrapped in a doctest."""
diff --git a/pyflakes/test/test_other.py b/pyflakes/test/test_other.py
index 1b10e02..775fdde 100644
--- a/pyflakes/test/test_other.py
+++ b/pyflakes/test/test_other.py
@@ -1755,6 +1755,159 @@ class TestUnusedAssignment(TestCase):
         ''')
 
 
+class TestStringFormatting(TestCase):
+
+    @skipIf(version_info < (3, 6), 'new in Python 3.6')
+    def test_f_string_without_placeholders(self):
+        self.flakes("f'foo'", m.FStringMissingPlaceholders)
+        self.flakes('''
+            f"""foo
+            bar
+            """
+        ''', m.FStringMissingPlaceholders)
+        self.flakes('''
+            print(
+                f'foo'
+                f'bar'
+            )
+        ''', m.FStringMissingPlaceholders)
+        # this is an "escaped placeholder" but not a placeholder
+        self.flakes("f'{{}}'", m.FStringMissingPlaceholders)
+        # ok: f-string with placeholders
+        self.flakes('''
+            x = 5
+            print(f'{x}')
+        ''')
+        # ok: f-string with format specifiers
+        self.flakes('''
+            x = 'a' * 90
+            print(f'{x:.8}')
+        ''')
+        # ok: f-string with multiple format specifiers
+        self.flakes('''
+            x = y = 5
+            print(f'{x:>2} {y:>2}')
+        ''')
+
+    def test_invalid_dot_format_calls(self):
+        self.flakes('''
+            '{'.format(1)
+        ''', m.StringDotFormatInvalidFormat)
+        self.flakes('''
+            '{} {1}'.format(1, 2)
+        ''', m.StringDotFormatMixingAutomatic)
+        self.flakes('''
+            '{0} {}'.format(1, 2)
+        ''', m.StringDotFormatMixingAutomatic)
+        self.flakes('''
+            '{}'.format(1, 2)
+        ''', m.StringDotFormatExtraPositionalArguments)
+        self.flakes('''
+            '{}'.format(1, bar=2)
+        ''', m.StringDotFormatExtraNamedArguments)
+        self.flakes('''
+            '{} {}'.format(1)
+        ''', m.StringDotFormatMissingArgument)
+        self.flakes('''
+            '{2}'.format()
+        ''', m.StringDotFormatMissingArgument)
+        self.flakes('''
+            '{bar}'.format()
+        ''', m.StringDotFormatMissingArgument)
+        # too much string recursion (placeholder-in-placeholder)
+        self.flakes('''
+            '{:{:{}}}'.format(1, 2, 3)
+        ''', m.StringDotFormatInvalidFormat)
+        # ok: dotted / bracketed names need to handle the param differently
+        self.flakes("'{.__class__}'.format('')")
+        self.flakes("'{foo[bar]}'.format(foo={'bar': 'barv'})")
+        # ok: placeholder-placeholders
+        self.flakes('''
+            print('{:{}} {}'.format(1, 15, 2))
+        ''')
+        # ok: not a placeholder-placeholder
+        self.flakes('''
+            print('{:2}'.format(1))
+        ''')
+        # ok: not mixed automatic
+        self.flakes('''
+            '{foo}-{}'.format(1, foo=2)
+        ''')
+        # ok: we can't determine statically the format args
+        self.flakes('''
+            a = ()
+            "{}".format(*a)
+        ''')
+        self.flakes('''
+            k = {}
+            "{foo}".format(**k)
+        ''')
+
+    def test_invalid_percent_format_calls(self):
+        self.flakes('''
+            '%(foo)' % {'foo': 'bar'}
+        ''', m.PercentFormatInvalidFormat)
+        self.flakes('''
+            '%s %(foo)s' % {'foo': 'bar'}
+        ''', m.PercentFormatMixedPositionalAndNamed)
+        self.flakes('''
+            '%(foo)s %s' % {'foo': 'bar'}
+        ''', m.PercentFormatMixedPositionalAndNamed)
+        self.flakes('''
+            '%j' % (1,)
+        ''', m.PercentFormatUnsupportedFormatCharacter)
+        self.flakes('''
+            '%s %s' % (1,)
+        ''', m.PercentFormatPositionalCountMismatch)
+        self.flakes('''
+            '%s %s' % (1, 2, 3)
+        ''', m.PercentFormatPositionalCountMismatch)
+        self.flakes('''
+            '%(bar)s' % {}
+        ''', m.PercentFormatMissingArgument,)
+        self.flakes('''
+            '%(bar)s' % {'bar': 1, 'baz': 2}
+        ''', m.PercentFormatExtraNamedArguments)
+        self.flakes('''
+            '%(bar)s' % (1, 2, 3)
+        ''', m.PercentFormatExpectedMapping)
+        self.flakes('''
+            '%s %s' % {'k': 'v'}
+        ''', m.PercentFormatExpectedSequence)
+        self.flakes('''
+            '%(bar)*s' % {'bar': 'baz'}
+        ''', m.PercentFormatStarRequiresSequence)
+        # ok: single %s with mapping
+        self.flakes('''
+            '%s' % {'foo': 'bar', 'baz': 'womp'}
+        ''')
+        # ok: does not cause a MemoryError (the strings aren't evaluated)
+        self.flakes('''
+            "%1000000000000f" % 1
+        ''')
+        # ok: %% should not count towards placeholder count
+        self.flakes('''
+            '%% %s %% %s' % (1, 2)
+        ''')
+        # ok: * consumes one positional argument
+        self.flakes('''
+            '%.*f' % (2, 1.1234)
+            '%*.*f' % (5, 2, 3.1234)
+        ''')
+
+    @skipIf(version_info < (3, 5), 'new in Python 3.5')
+    def test_ok_percent_format_cannot_determine_element_count(self):
+        self.flakes('''
+            a = []
+            '%s %s' % [*a]
+            '%s %s' % (*a,)
+        ''')
+        self.flakes('''
+            k = {}
+            '%(k)s' % {**k}
+        ''')
+
+
 class TestAsyncStatements(TestCase):
 
     @skipIf(version_info < (3, 5), 'new in Python 3.5')

pip install -e .
parse_log_pytest
pytest
flake8 pytest
3.6
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///opt/conda/conda-bld/attrs_1642510447205/work
certifi==2021.5.30
flake8==5.0.4
importlib-metadata==4.2.0
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
mccabe==0.7.0
more-itertools @ file:///tmp/build/80754af9/more-itertools_1637733554872/work
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
pluggy @ file:///tmp/build/80754af9/pluggy_1615976315926/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pycodestyle==2.9.1
-e git+https://github.com/PyCQA/pyflakes.git@4a807d45f9dd47266c82035bf6e04508a77f0258#egg=pyflakes
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
pytest==6.2.4
toml @ file:///tmp/build/80754af9/toml_1616166611790/work
typing_extensions @ file:///opt/conda/conda-bld/typing_extensions_1647553014482/work
zipp @ file:///tmp/build/80754af9/zipp_1633618647012/work

name: pyflakes
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=21.4.0=pyhd3eb1b0_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - importlib_metadata=4.8.1=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - more-itertools=8.12.0=pyhd3eb1b0_0
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=21.3=pyhd3eb1b0_0
  - pip=21.2.2=py36h06a4308_0
  - pluggy=0.13.1=py36h06a4308_0
  - py=1.11.0=pyhd3eb1b0_0
  - pyparsing=3.0.4=pyhd3eb1b0_0
  - pytest=6.2.4=py36h06a4308_2
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - toml=0.10.2=pyhd3eb1b0_0
  - typing_extensions=4.1.1=pyh06a4308_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.6.0=pyhd3eb1b0_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - flake8==5.0.4
      - importlib-metadata==4.2.0
      - mccabe==0.7.0
      - pycodestyle==2.9.1
prefix: /opt/conda/envs/pyflakes

pyflakes/test/test_doctests.py::Test::test_globalUnderscoreInDoctest pyflakes/test/test_other.py::TestStringFormatting::test_f_string_without_placeholders pyflakes/test/test_other.py::TestStringFormatting::test_invalid_dot_format_calls pyflakes/test/test_other.py::TestStringFormatting::test_invalid_percent_format_calls
pyflakes/test/test_doctests.py::Test::test_doctestCanReferToClass pyflakes/test/test_doctests.py::Test::test_doctestCanReferToFunction pyflakes/test/test_doctests.py::Test::test_global_module_scope_pollution pyflakes/test/test_doctests.py::Test::test_global_undefined pyflakes/test/test_doctests.py::Test::test_ignore_nested_function pyflakes/test/test_doctests.py::Test::test_importBeforeDoctest pyflakes/test/test_doctests.py::Test::test_importInDoctestAndAfter pyflakes/test/test_doctests.py::Test::test_inaccessible_scope_class pyflakes/test/test_doctests.py::Test::test_indentationErrorInDoctest pyflakes/test/test_doctests.py::Test::test_nested_class pyflakes/test/test_doctests.py::Test::test_nested_doctest_ignored pyflakes/test/test_doctests.py::Test::test_noOffsetSyntaxErrorInDoctest pyflakes/test/test_doctests.py::Test::test_offsetAfterDoctests pyflakes/test/test_doctests.py::Test::test_offsetInDoctests pyflakes/test/test_doctests.py::Test::test_offsetInLambdasInDoctests pyflakes/test/test_doctests.py::Test::test_offsetWithMultiLineArgs pyflakes/test/test_doctests.py::Test::test_scope_class pyflakes/test/test_doctests.py::Test::test_singleUnderscoreInDoctest pyflakes/test/test_doctests.py::Test::test_syntaxErrorInDoctest pyflakes/test/test_doctests.py::TestOther::test_attrAugmentedAssignment pyflakes/test/test_doctests.py::TestOther::test_breakInsideLoop pyflakes/test/test_doctests.py::TestOther::test_breakOutsideLoop pyflakes/test/test_doctests.py::TestOther::test_classFunctionDecorator pyflakes/test/test_doctests.py::TestOther::test_classNameDefinedPreviously pyflakes/test/test_doctests.py::TestOther::test_classNameUndefinedInClassBody pyflakes/test/test_doctests.py::TestOther::test_classRedefinedAsFunction pyflakes/test/test_doctests.py::TestOther::test_classRedefinition pyflakes/test/test_doctests.py::TestOther::test_classWithReturn pyflakes/test/test_doctests.py::TestOther::test_classWithYield pyflakes/test/test_doctests.py::TestOther::test_classWithYieldFrom pyflakes/test/test_doctests.py::TestOther::test_comparison pyflakes/test/test_doctests.py::TestOther::test_containment pyflakes/test/test_doctests.py::TestOther::test_continueInFinally pyflakes/test/test_doctests.py::TestOther::test_continueInsideLoop pyflakes/test/test_doctests.py::TestOther::test_continueOutsideLoop pyflakes/test/test_doctests.py::TestOther::test_defaultExceptLast pyflakes/test/test_doctests.py::TestOther::test_defaultExceptNotLast pyflakes/test/test_doctests.py::TestOther::test_doubleAssignmentConditionally pyflakes/test/test_doctests.py::TestOther::test_doubleAssignmentWithUse pyflakes/test/test_doctests.py::TestOther::test_duplicateArgs pyflakes/test/test_doctests.py::TestOther::test_ellipsis pyflakes/test/test_doctests.py::TestOther::test_extendedSlice pyflakes/test/test_doctests.py::TestOther::test_functionDecorator pyflakes/test/test_doctests.py::TestOther::test_functionRedefinedAsClass pyflakes/test/test_doctests.py::TestOther::test_function_arguments pyflakes/test/test_doctests.py::TestOther::test_function_arguments_python3 pyflakes/test/test_doctests.py::TestOther::test_globalDeclaredInDifferentScope pyflakes/test/test_doctests.py::TestOther::test_identity pyflakes/test/test_doctests.py::TestOther::test_localReferencedBeforeAssignment pyflakes/test/test_doctests.py::TestOther::test_loopControl pyflakes/test/test_doctests.py::TestOther::test_modernProperty pyflakes/test/test_doctests.py::TestOther::test_moduleWithReturn pyflakes/test/test_doctests.py::TestOther::test_moduleWithYield pyflakes/test/test_doctests.py::TestOther::test_moduleWithYieldFrom pyflakes/test/test_doctests.py::TestOther::test_redefinedClassFunction pyflakes/test/test_doctests.py::TestOther::test_redefinedFunction pyflakes/test/test_doctests.py::TestOther::test_redefinedIfElseFunction pyflakes/test/test_doctests.py::TestOther::test_redefinedIfElseInListComp pyflakes/test/test_doctests.py::TestOther::test_redefinedIfFunction pyflakes/test/test_doctests.py::TestOther::test_redefinedInDictComprehension pyflakes/test/test_doctests.py::TestOther::test_redefinedInGenerator pyflakes/test/test_doctests.py::TestOther::test_redefinedInSetComprehension pyflakes/test/test_doctests.py::TestOther::test_redefinedTryExceptFunction pyflakes/test/test_doctests.py::TestOther::test_redefinedTryFunction pyflakes/test/test_doctests.py::TestOther::test_redefinedUnderscoreFunction pyflakes/test/test_doctests.py::TestOther::test_redefinedUnderscoreImportation pyflakes/test/test_doctests.py::TestOther::test_starredAssignmentErrors pyflakes/test/test_doctests.py::TestOther::test_starredAssignmentNoError pyflakes/test/test_doctests.py::TestOther::test_unaryPlus pyflakes/test/test_doctests.py::TestOther::test_undefinedBaseClass pyflakes/test/test_doctests.py::TestOther::test_varAugmentedAssignment pyflakes/test/test_doctests.py::TestImports::test_aliasedImport pyflakes/test/test_doctests.py::TestImports::test_aliasedImportShadowModule pyflakes/test/test_doctests.py::TestImports::test_assignRHSFirst pyflakes/test/test_doctests.py::TestImports::test_assignedToGlobal pyflakes/test/test_doctests.py::TestImports::test_differentSubmoduleImport pyflakes/test/test_doctests.py::TestImports::test_duplicateSubmoduleImport pyflakes/test/test_doctests.py::TestImports::test_functionNamesAreBoundNow pyflakes/test/test_doctests.py::TestImports::test_functionsRunLater pyflakes/test/test_doctests.py::TestImports::test_futureImport pyflakes/test/test_doctests.py::TestImports::test_futureImportFirst pyflakes/test/test_doctests.py::TestImports::test_futureImportStar pyflakes/test/test_doctests.py::TestImports::test_futureImportUndefined pyflakes/test/test_doctests.py::TestImports::test_futureImportUsed pyflakes/test/test_doctests.py::TestImports::test_ignoreNonImportRedefinitions pyflakes/test/test_doctests.py::TestImports::test_importInClass pyflakes/test/test_doctests.py::TestImports::test_importStar pyflakes/test/test_doctests.py::TestImports::test_importStar_relative pyflakes/test/test_doctests.py::TestImports::test_importUsedInMethodDefinition pyflakes/test/test_doctests.py::TestImports::test_importedInClass pyflakes/test/test_doctests.py::TestImports::test_localImportStar pyflakes/test/test_doctests.py::TestImports::test_methodsDontUseClassScope pyflakes/test/test_doctests.py::TestImports::test_nestedClassAndFunctionScope pyflakes/test/test_doctests.py::TestImports::test_nestedFunctionsNestScope pyflakes/test/test_doctests.py::TestImports::test_newAssignment pyflakes/test/test_doctests.py::TestImports::test_nonGlobalDoesNotRedefine pyflakes/test/test_doctests.py::TestImports::test_notUsedInNestedScope pyflakes/test/test_doctests.py::TestImports::test_packageImport pyflakes/test/test_doctests.py::TestImports::test_redefinedButUsedLater pyflakes/test/test_doctests.py::TestImports::test_redefinedByClass pyflakes/test/test_doctests.py::TestImports::test_redefinedByExcept pyflakes/test/test_doctests.py::TestImports::test_redefinedByFor pyflakes/test/test_doctests.py::TestImports::test_redefinedByFunction pyflakes/test/test_doctests.py::TestImports::test_redefinedBySubclass pyflakes/test/test_doctests.py::TestImports::test_redefinedIf pyflakes/test/test_doctests.py::TestImports::test_redefinedIfElse pyflakes/test/test_doctests.py::TestImports::test_redefinedInClass pyflakes/test/test_doctests.py::TestImports::test_redefinedInNestedFunction pyflakes/test/test_doctests.py::TestImports::test_redefinedInNestedFunctionTwice pyflakes/test/test_doctests.py::TestImports::test_redefinedTry pyflakes/test/test_doctests.py::TestImports::test_redefinedTryElse pyflakes/test/test_doctests.py::TestImports::test_redefinedTryExcept pyflakes/test/test_doctests.py::TestImports::test_redefinedTryExceptElse pyflakes/test/test_doctests.py::TestImports::test_redefinedTryExceptElseFinally pyflakes/test/test_doctests.py::TestImports::test_redefinedTryExceptFinally pyflakes/test/test_doctests.py::TestImports::test_redefinedTryExceptMulti pyflakes/test/test_doctests.py::TestImports::test_redefinedTryNested pyflakes/test/test_doctests.py::TestImports::test_redefinedWhileUnused pyflakes/test/test_doctests.py::TestImports::test_shadowedByFor pyflakes/test/test_doctests.py::TestImports::test_shadowedByForDeep pyflakes/test/test_doctests.py::TestImports::test_shadowedByLambda pyflakes/test/test_doctests.py::TestImports::test_shadowedByParameter pyflakes/test/test_doctests.py::TestImports::test_tryingMultipleImports pyflakes/test/test_doctests.py::TestImports::test_unusedImport pyflakes/test/test_doctests.py::TestImports::test_unusedImport_relative pyflakes/test/test_doctests.py::TestImports::test_unusedInNestedScope pyflakes/test/test_doctests.py::TestImports::test_unusedPackageImport pyflakes/test/test_doctests.py::TestImports::test_unused_package_with_submodule_import pyflakes/test/test_doctests.py::TestImports::test_usedAndGlobal pyflakes/test/test_doctests.py::TestImports::test_usedImport pyflakes/test/test_doctests.py::TestImports::test_usedImport_relative pyflakes/test/test_doctests.py::TestImports::test_usedInAssert pyflakes/test/test_doctests.py::TestImports::test_usedInAssignment pyflakes/test/test_doctests.py::TestImports::test_usedInAttributeAssign pyflakes/test/test_doctests.py::TestImports::test_usedInCall pyflakes/test/test_doctests.py::TestImports::test_usedInClass pyflakes/test/test_doctests.py::TestImports::test_usedInClassBase pyflakes/test/test_doctests.py::TestImports::test_usedInDict pyflakes/test/test_doctests.py::TestImports::test_usedInElifConditional pyflakes/test/test_doctests.py::TestImports::test_usedInElse pyflakes/test/test_doctests.py::TestImports::test_usedInExcept pyflakes/test/test_doctests.py::TestImports::test_usedInExec pyflakes/test/test_doctests.py::TestImports::test_usedInFor pyflakes/test/test_doctests.py::TestImports::test_usedInForElse pyflakes/test/test_doctests.py::TestImports::test_usedInFunction pyflakes/test/test_doctests.py::TestImports::test_usedInGetattr pyflakes/test/test_doctests.py::TestImports::test_usedInGlobal pyflakes/test/test_doctests.py::TestImports::test_usedInIfBody pyflakes/test/test_doctests.py::TestImports::test_usedInIfConditional pyflakes/test/test_doctests.py::TestImports::test_usedInKeywordArg pyflakes/test/test_doctests.py::TestImports::test_usedInLambda pyflakes/test/test_doctests.py::TestImports::test_usedInList pyflakes/test/test_doctests.py::TestImports::test_usedInListComp pyflakes/test/test_doctests.py::TestImports::test_usedInLogic pyflakes/test/test_doctests.py::TestImports::test_usedInOperators pyflakes/test/test_doctests.py::TestImports::test_usedInParameterDefault pyflakes/test/test_doctests.py::TestImports::test_usedInRaise pyflakes/test/test_doctests.py::TestImports::test_usedInReturn pyflakes/test/test_doctests.py::TestImports::test_usedInSlice pyflakes/test/test_doctests.py::TestImports::test_usedInSliceObj pyflakes/test/test_doctests.py::TestImports::test_usedInSubscript pyflakes/test/test_doctests.py::TestImports::test_usedInTry pyflakes/test/test_doctests.py::TestImports::test_usedInTryFinally pyflakes/test/test_doctests.py::TestImports::test_usedInTuple pyflakes/test/test_doctests.py::TestImports::test_usedInWhile pyflakes/test/test_doctests.py::TestImports::test_usedInYield pyflakes/test/test_doctests.py::TestImports::test_used_package_with_submodule_import pyflakes/test/test_doctests.py::TestImports::test_used_package_with_submodule_import_of_alias pyflakes/test/test_doctests.py::TestUndefinedNames::test_annotationUndefined pyflakes/test/test_doctests.py::TestUndefinedNames::test_badNestedClass pyflakes/test/test_doctests.py::TestUndefinedNames::test_builtinWindowsError pyflakes/test/test_doctests.py::TestUndefinedNames::test_builtins pyflakes/test/test_doctests.py::TestUndefinedNames::test_definedAsStarArgs pyflakes/test/test_doctests.py::TestUndefinedNames::test_definedAsStarUnpack pyflakes/test/test_doctests.py::TestUndefinedNames::test_definedByGlobal pyflakes/test/test_doctests.py::TestUndefinedNames::test_definedByGlobalMultipleNames pyflakes/test/test_doctests.py::TestUndefinedNames::test_definedFromLambdaInDictionaryComprehension pyflakes/test/test_doctests.py::TestUndefinedNames::test_definedFromLambdaInGenerator pyflakes/test/test_doctests.py::TestUndefinedNames::test_definedInClass pyflakes/test/test_doctests.py::TestUndefinedNames::test_definedInClassNested pyflakes/test/test_doctests.py::TestUndefinedNames::test_definedInGenExp pyflakes/test/test_doctests.py::TestUndefinedNames::test_definedInListComp pyflakes/test/test_doctests.py::TestUndefinedNames::test_del pyflakes/test/test_doctests.py::TestUndefinedNames::test_delConditional pyflakes/test/test_doctests.py::TestUndefinedNames::test_delConditionalNested pyflakes/test/test_doctests.py::TestUndefinedNames::test_delExceptionInExcept pyflakes/test/test_doctests.py::TestUndefinedNames::test_delGlobal pyflakes/test/test_doctests.py::TestUndefinedNames::test_delUndefined pyflakes/test/test_doctests.py::TestUndefinedNames::test_delWhile pyflakes/test/test_doctests.py::TestUndefinedNames::test_delWhileNested pyflakes/test/test_doctests.py::TestUndefinedNames::test_delWhileTestUsage pyflakes/test/test_doctests.py::TestUndefinedNames::test_doubleNestingReportsClosestName pyflakes/test/test_doctests.py::TestUndefinedNames::test_dunderClass pyflakes/test/test_doctests.py::TestUndefinedNames::test_functionsNeedGlobalScope pyflakes/test/test_doctests.py::TestUndefinedNames::test_globalFromNestedScope pyflakes/test/test_doctests.py::TestUndefinedNames::test_globalImportStar pyflakes/test/test_doctests.py::TestUndefinedNames::test_globalInGlobalScope pyflakes/test/test_doctests.py::TestUndefinedNames::test_global_reset_name_only pyflakes/test/test_doctests.py::TestUndefinedNames::test_intermediateClassScopeIgnored pyflakes/test/test_doctests.py::TestUndefinedNames::test_keywordOnlyArgs pyflakes/test/test_doctests.py::TestUndefinedNames::test_keywordOnlyArgsUndefined pyflakes/test/test_doctests.py::TestUndefinedNames::test_laterRedefinedGlobalFromNestedScope pyflakes/test/test_doctests.py::TestUndefinedNames::test_laterRedefinedGlobalFromNestedScope2 pyflakes/test/test_doctests.py::TestUndefinedNames::test_laterRedefinedGlobalFromNestedScope3 pyflakes/test/test_doctests.py::TestUndefinedNames::test_magicGlobalsBuiltins pyflakes/test/test_doctests.py::TestUndefinedNames::test_magicGlobalsFile pyflakes/test/test_doctests.py::TestUndefinedNames::test_magicGlobalsName pyflakes/test/test_doctests.py::TestUndefinedNames::test_magicGlobalsPath pyflakes/test/test_doctests.py::TestUndefinedNames::test_magicModuleInClassScope pyflakes/test/test_doctests.py::TestUndefinedNames::test_metaClassUndefined pyflakes/test/test_doctests.py::TestUndefinedNames::test_moduleAnnotations pyflakes/test/test_doctests.py::TestUndefinedNames::test_namesDeclaredInExceptBlocks pyflakes/test/test_doctests.py::TestUndefinedNames::test_nestedClass pyflakes/test/test_doctests.py::TestUndefinedNames::test_undefined pyflakes/test/test_doctests.py::TestUndefinedNames::test_undefinedAugmentedAssignment pyflakes/test/test_doctests.py::TestUndefinedNames::test_undefinedExceptionName pyflakes/test/test_doctests.py::TestUndefinedNames::test_undefinedExceptionNameObscuringGlobalVariableFalsePositive1 pyflakes/test/test_doctests.py::TestUndefinedNames::test_undefinedExceptionNameObscuringGlobalVariableFalsePositive2 pyflakes/test/test_doctests.py::TestUndefinedNames::test_undefinedExceptionNameObscuringLocalVariable2 pyflakes/test/test_doctests.py::TestUndefinedNames::test_undefinedExceptionNameObscuringLocalVariableFalsePositive1 pyflakes/test/test_doctests.py::TestUndefinedNames::test_undefinedExceptionNameObscuringLocalVariableFalsePositive2 pyflakes/test/test_doctests.py::TestUndefinedNames::test_undefinedFromLambdaInComprehension pyflakes/test/test_doctests.py::TestUndefinedNames::test_undefinedFromLambdaInDictionaryComprehension pyflakes/test/test_doctests.py::TestUndefinedNames::test_undefinedInGenExpNested pyflakes/test/test_doctests.py::TestUndefinedNames::test_undefinedInListComp pyflakes/test/test_doctests.py::TestUndefinedNames::test_undefinedInLoop pyflakes/test/test_doctests.py::TestUndefinedNames::test_undefinedWithErrorHandler pyflakes/test/test_doctests.py::TestUndefinedNames::test_unusedAsStarUnpack pyflakes/test/test_doctests.py::TestUndefinedNames::test_usedAsStarUnpack pyflakes/test/test_other.py::Test::test_attrAugmentedAssignment pyflakes/test/test_other.py::Test::test_breakInsideLoop pyflakes/test/test_other.py::Test::test_breakOutsideLoop pyflakes/test/test_other.py::Test::test_classFunctionDecorator pyflakes/test/test_other.py::Test::test_classNameDefinedPreviously pyflakes/test/test_other.py::Test::test_classNameUndefinedInClassBody pyflakes/test/test_other.py::Test::test_classRedefinedAsFunction pyflakes/test/test_other.py::Test::test_classRedefinition pyflakes/test/test_other.py::Test::test_classWithReturn pyflakes/test/test_other.py::Test::test_classWithYield pyflakes/test/test_other.py::Test::test_classWithYieldFrom pyflakes/test/test_other.py::Test::test_comparison pyflakes/test/test_other.py::Test::test_containment pyflakes/test/test_other.py::Test::test_continueInFinally pyflakes/test/test_other.py::Test::test_continueInsideLoop pyflakes/test/test_other.py::Test::test_continueOutsideLoop pyflakes/test/test_other.py::Test::test_defaultExceptLast pyflakes/test/test_other.py::Test::test_defaultExceptNotLast pyflakes/test/test_other.py::Test::test_doubleAssignmentConditionally pyflakes/test/test_other.py::Test::test_doubleAssignmentWithUse pyflakes/test/test_other.py::Test::test_duplicateArgs pyflakes/test/test_other.py::Test::test_ellipsis pyflakes/test/test_other.py::Test::test_extendedSlice pyflakes/test/test_other.py::Test::test_functionDecorator pyflakes/test/test_other.py::Test::test_functionRedefinedAsClass pyflakes/test/test_other.py::Test::test_function_arguments pyflakes/test/test_other.py::Test::test_function_arguments_python3 pyflakes/test/test_other.py::Test::test_globalDeclaredInDifferentScope pyflakes/test/test_other.py::Test::test_identity pyflakes/test/test_other.py::Test::test_localReferencedBeforeAssignment pyflakes/test/test_other.py::Test::test_loopControl pyflakes/test/test_other.py::Test::test_modernProperty pyflakes/test/test_other.py::Test::test_moduleWithReturn pyflakes/test/test_other.py::Test::test_moduleWithYield pyflakes/test/test_other.py::Test::test_moduleWithYieldFrom pyflakes/test/test_other.py::Test::test_redefinedClassFunction pyflakes/test/test_other.py::Test::test_redefinedFunction pyflakes/test/test_other.py::Test::test_redefinedIfElseFunction pyflakes/test/test_other.py::Test::test_redefinedIfElseInListComp pyflakes/test/test_other.py::Test::test_redefinedIfFunction pyflakes/test/test_other.py::Test::test_redefinedInDictComprehension pyflakes/test/test_other.py::Test::test_redefinedInGenerator pyflakes/test/test_other.py::Test::test_redefinedInSetComprehension pyflakes/test/test_other.py::Test::test_redefinedTryExceptFunction pyflakes/test/test_other.py::Test::test_redefinedTryFunction pyflakes/test/test_other.py::Test::test_redefinedUnderscoreFunction pyflakes/test/test_other.py::Test::test_redefinedUnderscoreImportation pyflakes/test/test_other.py::Test::test_starredAssignmentErrors pyflakes/test/test_other.py::Test::test_starredAssignmentNoError pyflakes/test/test_other.py::Test::test_unaryPlus pyflakes/test/test_other.py::Test::test_undefinedBaseClass pyflakes/test/test_other.py::Test::test_varAugmentedAssignment pyflakes/test/test_other.py::TestUnusedAssignment::test_assert_static pyflakes/test/test_other.py::TestUnusedAssignment::test_assert_tuple pyflakes/test/test_other.py::TestUnusedAssignment::test_assert_tuple_empty pyflakes/test/test_other.py::TestUnusedAssignment::test_assert_with_message pyflakes/test/test_other.py::TestUnusedAssignment::test_assert_without_message pyflakes/test/test_other.py::TestUnusedAssignment::test_assignInForLoop pyflakes/test/test_other.py::TestUnusedAssignment::test_assignInListComprehension pyflakes/test/test_other.py::TestUnusedAssignment::test_assignToGlobal pyflakes/test/test_other.py::TestUnusedAssignment::test_assignToMember pyflakes/test/test_other.py::TestUnusedAssignment::test_assignToNonlocal pyflakes/test/test_other.py::TestUnusedAssignment::test_assignmentInsideLoop pyflakes/test/test_other.py::TestUnusedAssignment::test_augmentedAssignmentImportedFunctionCall pyflakes/test/test_other.py::TestUnusedAssignment::test_closedOver pyflakes/test/test_other.py::TestUnusedAssignment::test_dictComprehension pyflakes/test/test_other.py::TestUnusedAssignment::test_doubleClosedOver pyflakes/test/test_other.py::TestUnusedAssignment::test_exceptWithoutNameInFunction pyflakes/test/test_other.py::TestUnusedAssignment::test_exceptWithoutNameInFunctionTuple pyflakes/test/test_other.py::TestUnusedAssignment::test_exceptionUnusedInExcept pyflakes/test/test_other.py::TestUnusedAssignment::test_exceptionUnusedInExceptInFunction pyflakes/test/test_other.py::TestUnusedAssignment::test_exceptionUsedInExcept pyflakes/test/test_other.py::TestUnusedAssignment::test_f_string pyflakes/test/test_other.py::TestUnusedAssignment::test_generatorExpression pyflakes/test/test_other.py::TestUnusedAssignment::test_ifexp pyflakes/test/test_other.py::TestUnusedAssignment::test_listUnpacking pyflakes/test/test_other.py::TestUnusedAssignment::test_setComprehensionAndLiteral pyflakes/test/test_other.py::TestUnusedAssignment::test_tracebackhideSpecialVariable pyflakes/test/test_other.py::TestUnusedAssignment::test_tupleUnpacking pyflakes/test/test_other.py::TestUnusedAssignment::test_unusedUnderscoreVariable pyflakes/test/test_other.py::TestUnusedAssignment::test_unusedVariable pyflakes/test/test_other.py::TestUnusedAssignment::test_unusedVariableAsLocals pyflakes/test/test_other.py::TestUnusedAssignment::test_unusedVariableNoLocals pyflakes/test/test_other.py::TestUnusedAssignment::test_variableUsedInLoop pyflakes/test/test_other.py::TestUnusedAssignment::test_withStatementAttributeName pyflakes/test/test_other.py::TestUnusedAssignment::test_withStatementComplicatedTarget pyflakes/test/test_other.py::TestUnusedAssignment::test_withStatementListNames pyflakes/test/test_other.py::TestUnusedAssignment::test_withStatementNameDefinedInBody pyflakes/test/test_other.py::TestUnusedAssignment::test_withStatementNoNames pyflakes/test/test_other.py::TestUnusedAssignment::test_withStatementSingleName pyflakes/test/test_other.py::TestUnusedAssignment::test_withStatementSingleNameRedefined pyflakes/test/test_other.py::TestUnusedAssignment::test_withStatementSingleNameUndefined pyflakes/test/test_other.py::TestUnusedAssignment::test_withStatementSubscript pyflakes/test/test_other.py::TestUnusedAssignment::test_withStatementSubscriptUndefined pyflakes/test/test_other.py::TestUnusedAssignment::test_withStatementTupleNames pyflakes/test/test_other.py::TestUnusedAssignment::test_withStatementTupleNamesRedefined pyflakes/test/test_other.py::TestUnusedAssignment::test_withStatementTupleNamesUndefined pyflakes/test/test_other.py::TestUnusedAssignment::test_withStatementUndefinedInExpression pyflakes/test/test_other.py::TestUnusedAssignment::test_withStatementUndefinedInside pyflakes/test/test_other.py::TestUnusedAssignment::test_yieldFromUndefined pyflakes/test/test_other.py::TestStringFormatting::test_ok_percent_format_cannot_determine_element_count pyflakes/test/test_other.py::TestAsyncStatements::test_asyncDef pyflakes/test/test_other.py::TestAsyncStatements::test_asyncDefAwait pyflakes/test/test_other.py::TestAsyncStatements::test_asyncDefUndefined pyflakes/test/test_other.py::TestAsyncStatements::test_asyncFor pyflakes/test/test_other.py::TestAsyncStatements::test_asyncForUnderscoreLoopVar pyflakes/test/test_other.py::TestAsyncStatements::test_asyncWith pyflakes/test/test_other.py::TestAsyncStatements::test_asyncWithItem pyflakes/test/test_other.py::TestAsyncStatements::test_continueInAsyncForFinally pyflakes/test/test_other.py::TestAsyncStatements::test_formatstring pyflakes/test/test_other.py::TestAsyncStatements::test_loopControlInAsyncFor pyflakes/test/test_other.py::TestAsyncStatements::test_loopControlInAsyncForElse pyflakes/test/test_other.py::TestAsyncStatements::test_matmul pyflakes/test/test_other.py::TestAsyncStatements::test_raise_notimplemented pyflakes/test/test_other.py::TestIncompatiblePrintOperator::test_invalid_print_when_imported_from_future pyflakes/test/test_other.py::TestIncompatiblePrintOperator::test_print_as_condition_test pyflakes/test/test_other.py::TestIncompatiblePrintOperator::test_print_function_assignment pyflakes/test/test_other.py::TestIncompatiblePrintOperator::test_print_in_lambda pyflakes/test/test_other.py::TestIncompatiblePrintOperator::test_print_returned_in_function pyflakes/test/test_other.py::TestIncompatiblePrintOperator::test_valid_print
README.rst pyflakes/messages.py pyflakes/__init__.py NEWS.rst pyflakes/checker.py
README.rst pyflakes/messages.py pyflakes/__init__.py NEWS.rst pyflakes/checker.py