From cf6f577928f5a1f4e98b02b8e723311cae830305 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C5=81ukasz=20Langa?= Date: Thu, 22 Mar 2018 23:52:21 -0700 Subject: [PATCH] Properle space complex expressions in default values of typed arguments Fixes #60 --- README.md | 3 +++ black.py | 23 +++++++++++++---------- tests/function.py | 15 +++++++++++++++ 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 3558254..014780b 100644 --- a/README.md +++ b/README.md @@ -311,6 +311,9 @@ More details can be found in [CONTRIBUTING](CONTRIBUTING.md). * automatic detection of deprecated Python 2 forms of print statements and exec statements in the formatted file (#49) +* use proper spaces for complex expressions in default values of typed + function arguments (#60) + * only return exit code 1 when --check is used (#50) * don't remove single trailing commas from square bracket indexing diff --git a/black.py b/black.py index e39cf7d..7ca6bc6 100644 --- a/black.py +++ b/black.py @@ -419,7 +419,7 @@ class BracketTracker: """Returns True if there is an yet unmatched open bracket on the line.""" return bool(self.bracket_match) - def max_priority(self, exclude: Iterable[LeafID] =()) -> int: + def max_priority(self, exclude: Iterable[LeafID] = ()) -> int: """Returns the highest priority of a delimiter found on the line. Values are consistent with what `is_delimiter()` returns. @@ -885,14 +885,17 @@ def whitespace(leaf: Leaf) -> str: # noqa C901 return SPACE if prevp.type == token.COMMA else NO if prevp.type == token.EQUAL: - if prevp.parent and prevp.parent.type in { - syms.arglist, - syms.argument, - syms.parameters, - syms.typedargslist, - syms.varargslist, - }: - return NO + if prevp.parent: + if prevp.parent.type in { + syms.arglist, syms.argument, syms.parameters, syms.varargslist + }: + return NO + + elif prevp.parent.type == syms.typedargslist: + # A bit hacky: if the equal sign has whitespace, it means we + # previously found it's a typed argument. So, we're using + # that, too. + return prevp.prefix elif prevp.type == token.DOUBLESTAR: if prevp.parent and prevp.parent.type in { @@ -938,7 +941,7 @@ def whitespace(leaf: Leaf) -> str: # noqa C901 if not prev or prev.type != token.COMMA: return NO - if p.type == syms.varargslist: + elif p.type == syms.varargslist: # lambdas if t == token.RPAR: return NO diff --git a/tests/function.py b/tests/function.py index 888ef9f..08ab2b8 100644 --- a/tests/function.py +++ b/tests/function.py @@ -31,6 +31,7 @@ def function_signature_stress_test(number:int,no_annotation=None,text:str="defau def spaces(a=1, b=(), c=[], d={}, e=True, f=-1, g=1 if False else 2, h="", i=r''): offset = attr.ib(default=attr.Factory( lambda: _r.uniform(10000, 200000))) assert task._cancel_stack[:len(old_stack)] == old_stack +def spaces_types(a: int = 1, b: tuple = (), c: list = [], d: dict = {}, e: bool = True, f: int = -1, g: int = 1 if False else 2, h: str = "", i: str = r''): ... def spaces2(result= _core.Value(None)): ... def example(session): @@ -123,6 +124,20 @@ def spaces(a=1, b=(), c=[], d={}, e=True, f=-1, g=1 if False else 2, h="", i=r'' assert task._cancel_stack[:len(old_stack)] == old_stack +def spaces_types( + a: int = 1, + b: tuple = (), + c: list = [], + d: dict = {}, + e: bool = True, + f: int = -1, + g: int = 1 if False else 2, + h: str = "", + i: str = r'', +): + ... + + def spaces2(result=_core.Value(None)): ... -- 2.39.2