autodetect Python 3.6 on the basis of underscores (#461)
This commit is contained in:
parent
66b82ced50
commit
b719d85ccc
@ -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
|
pass `--skip-string-normalization` on the command line. This is meant as
|
||||||
an adoption helper, avoid using this for new projects.
|
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
|
### Line breaks & binary operators
|
||||||
|
|
||||||
@ -843,6 +849,8 @@ More details can be found in [CONTRIBUTING](CONTRIBUTING.md).
|
|||||||
|
|
||||||
### 18.8b0
|
### 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
|
* numeric literals are now normalized to include `_` separators on Python 3.6+ code
|
||||||
(#452)
|
(#452)
|
||||||
|
|
||||||
|
7
black.py
7
black.py
@ -2891,7 +2891,8 @@ def is_python36(node: Node) -> bool:
|
|||||||
"""Return True if the current file is using Python 3.6+ features.
|
"""Return True if the current file is using Python 3.6+ features.
|
||||||
|
|
||||||
Currently looking for:
|
Currently looking for:
|
||||||
- f-strings; and
|
- f-strings;
|
||||||
|
- underscores in numeric literals; and
|
||||||
- trailing commas after * or ** in function signatures and calls.
|
- trailing commas after * or ** in function signatures and calls.
|
||||||
"""
|
"""
|
||||||
for n in node.pre_order():
|
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"}:
|
if value_head in {'f"', 'F"', "f'", "F'", "rf", "fr", "RF", "FR"}:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
elif n.type == token.NUMBER:
|
||||||
|
if "_" in n.value: # type: ignore
|
||||||
|
return True
|
||||||
|
|
||||||
elif (
|
elif (
|
||||||
n.type in {syms.typedargslist, syms.arglist}
|
n.type in {syms.typedargslist, syms.arglist}
|
||||||
and n.children
|
and n.children
|
||||||
|
@ -722,6 +722,10 @@ def test_is_python36(self) -> None:
|
|||||||
self.assertTrue(black.is_python36(node))
|
self.assertTrue(black.is_python36(node))
|
||||||
node = black.lib2to3_parse("def f(*, arg): f'string'\n")
|
node = black.lib2to3_parse("def f(*, arg): f'string'\n")
|
||||||
self.assertTrue(black.is_python36(node))
|
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")
|
source, expected = read_data("function")
|
||||||
node = black.lib2to3_parse(source)
|
node = black.lib2to3_parse(source)
|
||||||
self.assertTrue(black.is_python36(node))
|
self.assertTrue(black.is_python36(node))
|
||||||
|
Loading…
Reference in New Issue
Block a user