Ignore builtins when detecting missing f-strings (#9849)

## Summary

Reported on Discord: if the name maps to a builtin, it's not bound
locally, so is very unlikely to be intended as an f-string expression.
This commit is contained in:
Charlie Marsh 2024-02-05 20:49:56 -08:00 committed by GitHub
parent df7fb95cbc
commit a662c2447c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 20 additions and 13 deletions

View file

@ -66,6 +66,7 @@ def negative_cases():
c = """ {b} """ c = """ {b} """
d = "bad variable: {invalid}" d = "bad variable: {invalid}"
e = "incorrect syntax: {}" e = "incorrect syntax: {}"
f = "uses a builtin: {max}"
json = "{ positive: false }" json = "{ positive: false }"
json2 = "{ 'positive': false }" json2 = "{ 'positive': false }"
json3 = "{ 'positive': 'false' }" json3 = "{ 'positive': 'false' }"

View file

@ -124,7 +124,13 @@ fn should_be_fstring(
.filter_map(|element| element.as_expression()) .filter_map(|element| element.as_expression())
{ {
if let ast::Expr::Name(ast::ExprName { id, .. }) = element.expression.as_ref() { if let ast::Expr::Name(ast::ExprName { id, .. }) = element.expression.as_ref() {
if kw_idents.contains(id.as_str()) || semantic.lookup_symbol(id).is_none() { if kw_idents.contains(id.as_str()) {
return false;
}
if semantic
.lookup_symbol(id)
.map_or(true, |id| semantic.binding(id).kind.is_builtin())
{
return false; return false;
} }
has_name = true; has_name = true;

View file

@ -276,20 +276,20 @@ RUF027.py:52:9: RUF027 [*] Possible f-string without an `f` prefix
54 54 | def alternative_formatter(src, **kwargs): 54 54 | def alternative_formatter(src, **kwargs):
55 55 | src.format(**kwargs) 55 55 | src.format(**kwargs)
RUF027.py:85:7: RUF027 [*] Possible f-string without an `f` prefix RUF027.py:86:7: RUF027 [*] Possible f-string without an `f` prefix
| |
83 | "always ignore this: {a}" 84 | "always ignore this: {a}"
84 | 85 |
85 | print("but don't ignore this: {val}") # RUF027 86 | print("but don't ignore this: {val}") # RUF027
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ RUF027 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ RUF027
| |
= help: Add `f` prefix = help: Add `f` prefix
Unsafe fix Unsafe fix
82 82 | 83 83 |
83 83 | "always ignore this: {a}" 84 84 | "always ignore this: {a}"
84 84 | 85 85 |
85 |-print("but don't ignore this: {val}") # RUF027 86 |-print("but don't ignore this: {val}") # RUF027
85 |+print(f"but don't ignore this: {val}") # RUF027 86 |+print(f"but don't ignore this: {val}") # RUF027