limit. Line continuation backslashes are converted into parenthesized strings.
Unnecessary parentheses are stripped. The stability and status of this feature is
tracked in [this issue](https://github.com/psf/black/issues/2188).
+
+### Removing trailing newlines after code block open
+
+_Black_ will remove trailing newlines after code block openings. That means that the
+following code:
+
+```python
+def my_func():
+
+ print("The line above me will be deleted!")
+
+ print("But the line above me won't!")
+```
+
+Will be changed to:
+
+```python
+def my_func():
+ print("The line above me will be deleted!")
+
+ print("But the line above me won't!")
+```
+
+This new feature will be applied to **all code blocks**: `def`, `class`, `if`, `for`,
+`while`, `with`, `case` and `match`.
and self.leaves[0].value.startswith(('"""', "'''"))
)
+ @property
+ def opens_block(self) -> bool:
+ """Does this line open a new level of indentation."""
+ if len(self.leaves) == 0:
+ return False
+ return self.leaves[-1].type == token.COLON
+
def contains_standalone_comments(self, depth_limit: int = sys.maxsize) -> bool:
"""If so, needs to be split before emitting."""
for leaf in self.leaves:
):
return before, 1
+ if (
+ Preview.remove_block_trailing_newline in current_line.mode
+ and self.previous_line
+ and self.previous_line.opens_block
+ ):
+ return 0, 0
return before, 0
def _maybe_empty_lines_for_class_or_def(
--- /dev/null
+import random
+
+
+def foo1():
+
+ print("The newline above me should be deleted!")
+
+
+def foo2():
+
+
+
+ print("All the newlines above me should be deleted!")
+
+
+def foo3():
+
+ print("No newline above me!")
+
+ print("There is a newline above me, and that's OK!")
+
+
+def foo4():
+
+ # There is a comment here
+
+ print("The newline above me should not be deleted!")
+
+
+class Foo:
+ def bar(self):
+
+ print("The newline above me should be deleted!")
+
+
+for i in range(5):
+
+ print(f"{i}) The line above me should be removed!")
+
+
+for i in range(5):
+
+
+
+ print(f"{i}) The lines above me should be removed!")
+
+
+for i in range(5):
+
+ for j in range(7):
+
+ print(f"{i}) The lines above me should be removed!")
+
+
+if random.randint(0, 3) == 0:
+
+ print("The new line above me is about to be removed!")
+
+
+if random.randint(0, 3) == 0:
+
+
+
+
+ print("The new lines above me is about to be removed!")
+
+
+if random.randint(0, 3) == 0:
+ if random.uniform(0, 1) > 0.5:
+ print("Two lines above me are about to be removed!")
+
+
+while True:
+
+ print("The newline above me should be deleted!")
+
+
+while True:
+
+
+
+ print("The newlines above me should be deleted!")
+
+
+while True:
+
+ while False:
+
+ print("The newlines above me should be deleted!")
+
+
+with open("/path/to/file.txt", mode="w") as file:
+
+ file.write("The new line above me is about to be removed!")
+
+
+with open("/path/to/file.txt", mode="w") as file:
+
+
+
+ file.write("The new lines above me is about to be removed!")
+
+
+with open("/path/to/file.txt", mode="r") as read_file:
+
+ with open("/path/to/output_file.txt", mode="w") as write_file:
+
+ write_file.writelines(read_file.readlines())
+
+# output
+
+import random
+
+
+def foo1():
+ print("The newline above me should be deleted!")
+
+
+def foo2():
+ print("All the newlines above me should be deleted!")
+
+
+def foo3():
+ print("No newline above me!")
+
+ print("There is a newline above me, and that's OK!")
+
+
+def foo4():
+ # There is a comment here
+
+ print("The newline above me should not be deleted!")
+
+
+class Foo:
+ def bar(self):
+ print("The newline above me should be deleted!")
+
+
+for i in range(5):
+ print(f"{i}) The line above me should be removed!")
+
+
+for i in range(5):
+ print(f"{i}) The lines above me should be removed!")
+
+
+for i in range(5):
+ for j in range(7):
+ print(f"{i}) The lines above me should be removed!")
+
+
+if random.randint(0, 3) == 0:
+ print("The new line above me is about to be removed!")
+
+
+if random.randint(0, 3) == 0:
+ print("The new lines above me is about to be removed!")
+
+
+if random.randint(0, 3) == 0:
+ if random.uniform(0, 1) > 0.5:
+ print("Two lines above me are about to be removed!")
+
+
+while True:
+ print("The newline above me should be deleted!")
+
+
+while True:
+ print("The newlines above me should be deleted!")
+
+
+while True:
+ while False:
+ print("The newlines above me should be deleted!")
+
+
+with open("/path/to/file.txt", mode="w") as file:
+ file.write("The new line above me is about to be removed!")
+
+
+with open("/path/to/file.txt", mode="w") as file:
+ file.write("The new lines above me is about to be removed!")
+
+
+with open("/path/to/file.txt", mode="r") as read_file:
+ with open("/path/to/output_file.txt", mode="w") as write_file:
+ write_file.writelines(read_file.readlines())
assert_format(source, expected, mode, minimum_version=(3, 9))
+@pytest.mark.parametrize("filename", all_data_cases("preview_310"))
+def test_preview_minimum_python_310_format(filename: str) -> None:
+ source, expected = read_data("preview_310", filename)
+ mode = black.Mode(preview=True)
+ assert_format(source, expected, mode, minimum_version=(3, 10))
+
+
@pytest.mark.parametrize("filename", SOURCES)
def test_source_is_formatted(filename: str) -> None:
check_file("", filename, DEFAULT_MODE, data=False)