Skip to content

Commit

Permalink
Merge pull request #717 from taion/annot-missing-space
Browse files Browse the repository at this point in the history
Add E252 on missing whitespace for annotated parameter defaults
  • Loading branch information
sigmavirus24 committed Jan 24, 2018
2 parents f8ead16 + d9efb8f commit 6c8ea7b
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 5 deletions.
25 changes: 20 additions & 5 deletions pycodestyle.py
Original file line number Diff line number Diff line change
Expand Up @@ -869,7 +869,8 @@ def whitespace_around_named_parameter_equals(logical_line, tokens):
r"""Don't use spaces around the '=' sign in function arguments.
Don't use spaces around the '=' sign when used to indicate a
keyword argument or a default parameter value.
keyword argument or a default parameter value, except when using a type
annotation.
Okay: def complex(real, imag=0.0):
Okay: return magic(r=real, i=imag)
Expand All @@ -882,20 +883,29 @@ def whitespace_around_named_parameter_equals(logical_line, tokens):
E251: def complex(real, imag = 0.0):
E251: return magic(r = real, i = imag)
E252: def complex(real, image: float=0.0):
"""
parens = 0
no_space = False
require_space = False
prev_end = None
annotated_func_arg = False
in_def = bool(STARTSWITH_DEF_REGEX.match(logical_line))

message = "E251 unexpected spaces around keyword / parameter equals"
missing_message = "E252 missing whitespace around parameter equals"

for token_type, text, start, end, line in tokens:
if token_type == tokenize.NL:
continue
if no_space:
no_space = False
if start != prev_end:
yield (prev_end, message)
if require_space:
require_space = False
if start == prev_end:
yield (prev_end, missing_message)
if token_type == tokenize.OP:
if text in '([':
parens += 1
Expand All @@ -905,10 +915,15 @@ def whitespace_around_named_parameter_equals(logical_line, tokens):
annotated_func_arg = True
elif parens and text == ',' and parens == 1:
annotated_func_arg = False
elif parens and text == '=' and not annotated_func_arg:
no_space = True
if start != prev_end:
yield (prev_end, message)
elif parens and text == '=':
if not annotated_func_arg:
no_space = True
if start != prev_end:
yield (prev_end, message)
else:
require_space = True
if start == prev_end:
yield (prev_end, missing_message)
if not parens:
annotated_func_arg = False

Expand Down
3 changes: 3 additions & 0 deletions testsuite/E25.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,6 @@ async def add(a: int = 0, b: int = 0) -> int:
#: E272:1:6
async def add(a: int = 0, b: int = 0) -> int:
return a + b
#: E252:1:15 E252:1:16 E252:1:27 E252:1:36
def add(a: int=0, b: int =0, c: int= 0) -> int:
return a + b + c

0 comments on commit 6c8ea7b

Please sign in to comment.