Skip to content

Commit

Permalink
autodetect Python 3.6 on the basis of underscores (#461)
Browse files Browse the repository at this point in the history
  • Loading branch information
JelleZijlstra committed Aug 20, 2018
1 parent 66b82ce commit b719d85
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 1 deletion.
8 changes: 8 additions & 0 deletions README.md
Expand Up @@ -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

Expand Down Expand Up @@ -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)

Expand Down
7 changes: 6 additions & 1 deletion black.py
Expand Up @@ -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():
Expand All @@ -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
Expand Down
4 changes: 4 additions & 0 deletions tests/test_black.py
Expand Up @@ -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))
Expand Down

0 comments on commit b719d85

Please sign in to comment.