Force parentheses for power operations in unary expressions (#7955)

## Summary

E.g., given `-10**100`, reformat as `-(10**100)`.

Black special cases this (https://github.com/psf/black/pull/909) and
it's currently a deviation.

Closes https://github.com/astral-sh/ruff/issues/7951.
This commit is contained in:
Charlie Marsh 2023-10-15 21:41:50 -04:00 committed by GitHub
parent b6e75e58c9
commit 3d03e75a9d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 10 additions and 12 deletions

View file

@ -4,7 +4,7 @@ use ruff_python_ast::UnaryOp;
use crate::comments::{trailing_comments, SourceComment};
use crate::expression::parentheses::{
is_expression_parenthesized, NeedsParentheses, OptionalParentheses,
is_expression_parenthesized, NeedsParentheses, OptionalParentheses, Parentheses,
};
use crate::prelude::*;
@ -57,7 +57,14 @@ impl FormatNodeRule<ExprUnaryOp> for FormatExprUnaryOp {
space().fmt(f)?;
}
operand.format().fmt(f)
if operand
.as_bin_op_expr()
.is_some_and(|bin_op| bin_op.op.is_pow())
{
operand.format().with_options(Parentheses::Always).fmt(f)
} else {
operand.format().fmt(f)
}
}
fn fmt_dangling_comments(

View file

@ -266,15 +266,6 @@ last_call()
```diff
--- Black
+++ Ruff
@@ -31,7 +31,7 @@
-1
~int and not v1 ^ 123 + v2 | True
(~int) and (not ((v1 ^ (123 + v2)) | True))
-+(really ** -(confusing ** ~(operator**-precedence)))
++really ** -confusing ** ~operator**-precedence
flags & ~select.EPOLLIN and waiters.write_task is not None
lambda arg: None
lambda a=True: a
@@ -115,7 +115,7 @@
arg,
another,
@ -322,7 +313,7 @@ not great
-1
~int and not v1 ^ 123 + v2 | True
(~int) and (not ((v1 ^ (123 + v2)) | True))
+really ** -confusing ** ~operator**-precedence
+(really ** -(confusing ** ~(operator**-precedence)))
flags & ~select.EPOLLIN and waiters.write_task is not None
lambda arg: None
lambda a=True: a