diff options
author | Dmitry Jemerov <yole@google.com> | 2014-07-24 20:06:44 +0200 |
---|---|---|
committer | Dmitry Jemerov <yole@google.com> | 2014-07-24 20:06:44 +0200 |
commit | 103221e61a154aba6be0850a5ff142f3fd216b34 (patch) | |
tree | 55ddef3f46a378f966b2300e07cec511070772cb /pep8.py | |
parent | 4c5bf00cb613be617c7f48d3b2b82a1c7b895ac1 (diff) | |
download | pep8-103221e61a154aba6be0850a5ff142f3fd216b34.tar.gz |
Report W503 for line breaks before binary operators; issue #197. #ep14boat
Diffstat (limited to 'pep8.py')
-rwxr-xr-x | pep8.py | 39 |
1 files changed, 39 insertions, 0 deletions
@@ -922,6 +922,45 @@ def explicit_line_join(logical_line, tokens): parens -= 1 +def break_around_binary_operator(logical_line, tokens): + r""" + Avoid breaks before binary operators. + + The preferred place to break around a binary operator is after the + operator, not before it. + + W503: (width == 0\n + height == 0) + W503: (width == 0\n and height == 0) + + Okay: (width == 0 +\n height == 0) + Okay: foo(\n -x) + Okay: foo(x\n []) + Okay: x = '''\n''' + '' + Okay: foo(x,\n -y) + Okay: foo(x, # comment\n -y) + """ + def is_binary_operator(token_type, text): + # The % character is strictly speaking a binary operator, but the + # common usage seems to be to put it next to the format parameters, + # after a line break. + return ((token_type == tokenize.OP or text == 'and' or text == 'or') + and text not in "()[]{},:.;@=%") + + line_break = False + unary_context = True + for token_type, text, start, end, line in tokens: + if token_type == tokenize.COMMENT: + continue + if ('\n' in text or '\r' in text) and token_type != tokenize.STRING: + line_break = True + else: + if (is_binary_operator(token_type, text) and line_break + and not unary_context): + yield start, "W503 line break before binary operator" + unary_context = text in '([{,;' + line_break = False + + def comparison_to_singleton(logical_line, noqa): r"""Comparison to singletons should use "is" or "is not". |