autodetect Python 3.6 on the basis of underscores (#461)

This commit is contained in:
Jelle Zijlstra 2018-08-19 21:02:06 -07:00 committed by GitHub
parent 66b82ced50
commit b719d85ccc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 1 deletions

View File

@ -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)

View File

@ -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

View File

@ -722,6 +722,10 @@ def test_is_python36(self) -> None:
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))