mirror of
https://github.com/astral-sh/ruff.git
synced 2025-09-29 13:25:17 +00:00

Add a new method to the semantic model to simplify and improve the correctness of a common pattern
147 lines
3.2 KiB
Python
147 lines
3.2 KiB
Python
def foo():
|
|
...
|
|
|
|
|
|
def bar(x):
|
|
...
|
|
|
|
|
|
# Errors.
|
|
|
|
# FURB103
|
|
with open("file.txt", "w") as f:
|
|
f.write("test")
|
|
|
|
# FURB103
|
|
with open("file.txt", "wb") as f:
|
|
f.write(foobar)
|
|
|
|
# FURB103
|
|
with open("file.txt", mode="wb") as f:
|
|
f.write(b"abc")
|
|
|
|
# FURB103
|
|
with open("file.txt", "w", encoding="utf8") as f:
|
|
f.write(foobar)
|
|
|
|
# FURB103
|
|
with open("file.txt", "w", errors="ignore") as f:
|
|
f.write(foobar)
|
|
|
|
# FURB103
|
|
with open("file.txt", mode="w") as f:
|
|
f.write(foobar)
|
|
|
|
# FURB103
|
|
with open(foo(), "wb") as f:
|
|
# The body of `with` is non-trivial, but the recommendation holds.
|
|
bar("pre")
|
|
f.write(bar())
|
|
bar("post")
|
|
print("Done")
|
|
|
|
# FURB103
|
|
with open("a.txt", "w") as a, open("b.txt", "wb") as b:
|
|
a.write(x)
|
|
b.write(y)
|
|
|
|
# FURB103
|
|
with foo() as a, open("file.txt", "w") as b, foo() as c:
|
|
# We have other things in here, multiple with items, but the user
|
|
# writes a single time to file and that bit they can replace.
|
|
bar(a)
|
|
b.write(bar(bar(a + x)))
|
|
bar(c)
|
|
|
|
|
|
# FURB103
|
|
with open("file.txt", "w", newline="\r\n") as f:
|
|
f.write(foobar)
|
|
|
|
|
|
import builtins
|
|
|
|
|
|
# FURB103
|
|
with builtins.open("file.txt", "w", newline="\r\n") as f:
|
|
f.write(foobar)
|
|
|
|
|
|
from builtins import open as o
|
|
|
|
|
|
# FURB103
|
|
with o("file.txt", "w", newline="\r\n") as f:
|
|
f.write(foobar)
|
|
|
|
# Non-errors.
|
|
|
|
with open("file.txt", errors="ignore", mode="wb") as f:
|
|
# Path.write_bytes() does not support errors
|
|
f.write(foobar)
|
|
|
|
f2 = open("file2.txt", "w")
|
|
with open("file.txt", "w") as f:
|
|
f2.write(x)
|
|
|
|
# mode is dynamic
|
|
with open("file.txt", foo()) as f:
|
|
f.write(x)
|
|
|
|
# keyword mode is incorrect
|
|
with open("file.txt", mode="a+") as f:
|
|
f.write(x)
|
|
|
|
# enables line buffering, not supported in write_text()
|
|
with open("file.txt", buffering=1) as f:
|
|
f.write(x)
|
|
|
|
# dont mistake "newline" for "mode"
|
|
with open("file.txt", newline="wb") as f:
|
|
f.write(x)
|
|
|
|
# I guess we can possibly also report this case, but the question
|
|
# is why the user would put "w+" here in the first place.
|
|
with open("file.txt", "w+") as f:
|
|
f.write(x)
|
|
|
|
# Even though we write the whole file, we do other things.
|
|
with open("file.txt", "w") as f:
|
|
f.write(x)
|
|
f.seek(0)
|
|
x += f.read(100)
|
|
|
|
# This shouldn't error, since it could contain unsupported arguments, like `buffering`.
|
|
with open(*filename, mode="w") as f:
|
|
f.write(x)
|
|
|
|
# This shouldn't error, since it could contain unsupported arguments, like `buffering`.
|
|
with open(**kwargs) as f:
|
|
f.write(x)
|
|
|
|
# This shouldn't error, since it could contain unsupported arguments, like `buffering`.
|
|
with open("file.txt", **kwargs) as f:
|
|
f.write(x)
|
|
|
|
# This shouldn't error, since it could contain unsupported arguments, like `buffering`.
|
|
with open("file.txt", mode="w", **kwargs) as f:
|
|
f.write(x)
|
|
|
|
# This could error (but doesn't), since it can't contain unsupported arguments, like
|
|
# `buffering`.
|
|
with open(*filename, mode="w") as f:
|
|
f.write(x)
|
|
|
|
# This could error (but doesn't), since it can't contain unsupported arguments, like
|
|
# `buffering`.
|
|
with open(*filename, file="file.txt", mode="w") as f:
|
|
f.write(x)
|
|
|
|
# Loops imply multiple writes
|
|
with open("file.txt", "w") as f:
|
|
while x < 0:
|
|
f.write(foobar)
|
|
|
|
with open("file.txt", "w") as f:
|
|
for line in text:
|
|
f.write(line)
|