Skip to content

Commit

Permalink
bpo-36878: Allow extra text after # type: ignore comments (pythonGH…
Browse files Browse the repository at this point in the history
…-13238)

In the parser, when using the type_comments=True option, recognize
a TYPE_IGNORE as anything containing `# type: ignore` followed by
a non-alphanumeric character. This is to allow ignores such as
`# type: ignore[E1000]`.
  • Loading branch information
msullivan authored and ilevkivskyi committed May 11, 2019
1 parent 6236c98 commit d8320ec
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 9 deletions.
9 changes: 8 additions & 1 deletion Lib/test/test_type_comments.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,12 @@ def foo():
def bar():
x = 1 # type: ignore
def baz():
pass # type: ignore[excuse]
pass # type: ignore=excuse
pass # type: ignore [excuse]
x = 1 # type: ignore whatever
"""

# Test for long-form type-comments in arguments. A test function
Expand Down Expand Up @@ -266,7 +272,7 @@ def test_vardecl(self):

def test_ignores(self):
for tree in self.parse_all(ignores):
self.assertEqual([ti.lineno for ti in tree.type_ignores], [2, 5])
self.assertEqual([ti.lineno for ti in tree.type_ignores], [2, 5, 8, 9, 10, 11])
tree = self.classic_parse(ignores)
self.assertEqual(tree.type_ignores, [])

Expand Down Expand Up @@ -318,6 +324,7 @@ def check_both_ways(source):
check_both_ways("while True:\n continue # type: int\n")
check_both_ways("try: # type: int\n pass\nfinally:\n pass\n")
check_both_ways("try:\n pass\nfinally: # type: int\n pass\n")
check_both_ways("pass # type: ignorewhatever\n")

def test_func_type_input(self):

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
When using `type_comments=True` in `ast.parse`, treat `# type: ignore` followed by
a non-alphanumeric character and then arbitrary text as a type ignore, instead of
requiring nothing but whitespace or another comment. This is to permit formations
such as `# type: ignore[E1000]`.
13 changes: 5 additions & 8 deletions Parser/tokenizer.c
Original file line number Diff line number Diff line change
Expand Up @@ -1272,14 +1272,11 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end)

type_start = p;

is_type_ignore = tok->cur >= p + 6 && memcmp(p, "ignore", 6) == 0;
p += 6;
while (is_type_ignore && p < tok->cur) {
if (*p == '#')
break;
is_type_ignore = is_type_ignore && (*p == ' ' || *p == '\t');
p++;
}
/* A TYPE_IGNORE is "type: ignore" followed by the end of the token
* or anything non-alphanumeric. */
is_type_ignore = (
tok->cur >= p + 6 && memcmp(p, "ignore", 6) == 0
&& !(tok->cur > p + 6 && isalnum(p[6])));

if (is_type_ignore) {
/* If this type ignore is the only thing on the line, consume the newline also. */
Expand Down

0 comments on commit d8320ec

Please sign in to comment.