From b719d85ccc330170e40b2617307a7e3b2a0bab14 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Sun, 19 Aug 2018 21:02:06 -0700 Subject: [PATCH] autodetect Python 3.6 on the basis of underscores (#461) --- README.md | 8 ++++++++ black.py | 7 ++++++- tests/test_black.py | 4 ++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 96a24a1..9cb4f18 100644 --- a/README.md +++ b/README.md @@ -371,6 +371,12 @@ human-readable strings"](https://stackoverflow.com/a/56190)), you can pass `--skip-string-normalization` on the command line. This is meant as an adoption helper, avoid using this for new projects. +### Numeric literals + +*Black* standardizes all numeric literals to use lowercase letters: `0xab` +instead of `0XAB` and `1e10` instead of `1E10`. In Python 3.6+, *Black* +adds underscores to long numeric literals to aid readability: `100000000` +becomes `100_000_000`. ### Line breaks & binary operators @@ -843,6 +849,8 @@ More details can be found in [CONTRIBUTING](CONTRIBUTING.md). ### 18.8b0 +* code with `_` in numeric literals is recognized as Python 3.6+ (#461) + * numeric literals are now normalized to include `_` separators on Python 3.6+ code (#452) diff --git a/black.py b/black.py index c899bde..b65693e 100644 --- a/black.py +++ b/black.py @@ -2891,7 +2891,8 @@ def is_python36(node: Node) -> bool: """Return True if the current file is using Python 3.6+ features. Currently looking for: - - f-strings; and + - f-strings; + - underscores in numeric literals; and - trailing commas after * or ** in function signatures and calls. """ for n in node.pre_order(): @@ -2900,6 +2901,10 @@ def is_python36(node: Node) -> bool: if value_head in {'f"', 'F"', "f'", "F'", "rf", "fr", "RF", "FR"}: return True + elif n.type == token.NUMBER: + if "_" in n.value: # type: ignore + return True + elif ( n.type in {syms.typedargslist, syms.arglist} and n.children diff --git a/tests/test_black.py b/tests/test_black.py index 884d046..10d7f28 100644 --- a/tests/test_black.py +++ b/tests/test_black.py @@ -722,6 +722,10 @@ class BlackTestCase(unittest.TestCase): self.assertTrue(black.is_python36(node)) node = black.lib2to3_parse("def f(*, arg): f'string'\n") self.assertTrue(black.is_python36(node)) + node = black.lib2to3_parse("123_456\n") + self.assertTrue(black.is_python36(node)) + node = black.lib2to3_parse("123456\n") + self.assertFalse(black.is_python36(node)) source, expected = read_data("function") node = black.lib2to3_parse(source) self.assertTrue(black.is_python36(node)) -- 2.39.2