mirror of
https://github.com/astral-sh/ruff.git
synced 2025-09-30 13:51:16 +00:00
[ruff-0.7] Stabilise the expansion of open-file-with-context-handler
to work with other standard-library IO modules (SIM115
) (#13680)
Closes #7313.
This commit is contained in:
parent
2b87587ac2
commit
1b79ae9817
4 changed files with 284 additions and 383 deletions
|
@ -58,7 +58,6 @@ mod tests {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test_case(Rule::IfElseBlockInsteadOfIfExp, Path::new("SIM108.py"))]
|
#[test_case(Rule::IfElseBlockInsteadOfIfExp, Path::new("SIM108.py"))]
|
||||||
#[test_case(Rule::OpenFileWithContextHandler, Path::new("SIM115.py"))]
|
|
||||||
fn preview_rules(rule_code: Rule, path: &Path) -> Result<()> {
|
fn preview_rules(rule_code: Rule, path: &Path) -> Result<()> {
|
||||||
let snapshot = format!(
|
let snapshot = format!(
|
||||||
"preview__{}_{}",
|
"preview__{}_{}",
|
||||||
|
|
|
@ -14,13 +14,9 @@ use crate::checkers::ast::Checker;
|
||||||
/// ## Why is this bad?
|
/// ## Why is this bad?
|
||||||
/// If a file is opened without a context manager, it is not guaranteed that
|
/// If a file is opened without a context manager, it is not guaranteed that
|
||||||
/// the file will be closed (e.g., if an exception is raised), which can cause
|
/// the file will be closed (e.g., if an exception is raised), which can cause
|
||||||
/// resource leaks.
|
/// resource leaks. The rule detects a wide array of IO calls where context managers
|
||||||
///
|
/// could be used, such as `open`, `pathlib.Path(...).open()`, `tempfile.TemporaryFile()`
|
||||||
/// ## Preview-mode behavior
|
/// or`tarfile.TarFile(...).gzopen()`.
|
||||||
/// If [preview] mode is enabled, this rule will detect a wide array of IO calls where
|
|
||||||
/// context managers could be used, such as `tempfile.TemporaryFile()` or
|
|
||||||
/// `tarfile.TarFile(...).gzopen()`. If preview mode is not enabled, only `open()`,
|
|
||||||
/// `builtins.open()` and `pathlib.Path(...).open()` are detected.
|
|
||||||
///
|
///
|
||||||
/// ## Example
|
/// ## Example
|
||||||
/// ```python
|
/// ```python
|
||||||
|
@ -118,36 +114,9 @@ fn match_exit_stack(semantic: &SemanticModel) -> bool {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return `true` if `func` is the builtin `open` or `pathlib.Path(...).open`.
|
/// Return `true` if the expression is a call to `open()`,
|
||||||
fn is_open(semantic: &SemanticModel, call: &ast::ExprCall) -> bool {
|
/// or a call to some other standard-library function that opens a file.
|
||||||
// Ex) `open(...)`
|
fn is_open_call(semantic: &SemanticModel, call: &ast::ExprCall) -> bool {
|
||||||
if semantic.match_builtin_expr(&call.func, "open") {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ex) `pathlib.Path(...).open()`
|
|
||||||
let Expr::Attribute(ast::ExprAttribute { attr, value, .. }) = &*call.func else {
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
if attr != "open" {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
let Expr::Call(ast::ExprCall {
|
|
||||||
func: value_func, ..
|
|
||||||
}) = &**value
|
|
||||||
else {
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
semantic
|
|
||||||
.resolve_qualified_name(value_func)
|
|
||||||
.is_some_and(|qualified_name| matches!(qualified_name.segments(), ["pathlib", "Path"]))
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Return `true` if the expression is an `open` call or temporary file constructor.
|
|
||||||
fn is_open_preview(semantic: &SemanticModel, call: &ast::ExprCall) -> bool {
|
|
||||||
let func = &*call.func;
|
let func = &*call.func;
|
||||||
|
|
||||||
// Ex) `open(...)`
|
// Ex) `open(...)`
|
||||||
|
@ -203,8 +172,8 @@ fn is_open_preview(semantic: &SemanticModel, call: &ast::ExprCall) -> bool {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return `true` if the current expression is followed by a `close` call.
|
/// Return `true` if the current expression is immediately followed by a `.close()` call.
|
||||||
fn is_closed(semantic: &SemanticModel) -> bool {
|
fn is_immediately_closed(semantic: &SemanticModel) -> bool {
|
||||||
let Some(expr) = semantic.current_expression_grandparent() else {
|
let Some(expr) = semantic.current_expression_grandparent() else {
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
@ -231,18 +200,12 @@ fn is_closed(semantic: &SemanticModel) -> bool {
|
||||||
pub(crate) fn open_file_with_context_handler(checker: &mut Checker, call: &ast::ExprCall) {
|
pub(crate) fn open_file_with_context_handler(checker: &mut Checker, call: &ast::ExprCall) {
|
||||||
let semantic = checker.semantic();
|
let semantic = checker.semantic();
|
||||||
|
|
||||||
if checker.settings.preview.is_disabled() {
|
if !is_open_call(semantic, call) {
|
||||||
if !is_open(semantic, call) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if !is_open_preview(semantic, call) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ex) `open("foo.txt").close()`
|
// Ex) `open("foo.txt").close()`
|
||||||
if is_closed(semantic) {
|
if is_immediately_closed(semantic) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,3 +59,276 @@ SIM115.py:39:9: SIM115 Use a context manager for opening files
|
||||||
40 |
|
40 |
|
||||||
41 | # OK
|
41 | # OK
|
||||||
|
|
|
|
||||||
|
|
||||||
|
SIM115.py:80:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
78 | import fileinput
|
||||||
|
79 |
|
||||||
|
80 | f = tempfile.NamedTemporaryFile()
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ SIM115
|
||||||
|
81 | f = tempfile.TemporaryFile()
|
||||||
|
82 | f = tempfile.SpooledTemporaryFile()
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:81:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
80 | f = tempfile.NamedTemporaryFile()
|
||||||
|
81 | f = tempfile.TemporaryFile()
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^ SIM115
|
||||||
|
82 | f = tempfile.SpooledTemporaryFile()
|
||||||
|
83 | f = tarfile.open("foo.tar")
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:82:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
80 | f = tempfile.NamedTemporaryFile()
|
||||||
|
81 | f = tempfile.TemporaryFile()
|
||||||
|
82 | f = tempfile.SpooledTemporaryFile()
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ SIM115
|
||||||
|
83 | f = tarfile.open("foo.tar")
|
||||||
|
84 | f = TarFile("foo.tar").open()
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:83:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
81 | f = tempfile.TemporaryFile()
|
||||||
|
82 | f = tempfile.SpooledTemporaryFile()
|
||||||
|
83 | f = tarfile.open("foo.tar")
|
||||||
|
| ^^^^^^^^^^^^ SIM115
|
||||||
|
84 | f = TarFile("foo.tar").open()
|
||||||
|
85 | f = tarfile.TarFile("foo.tar").open()
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:84:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
82 | f = tempfile.SpooledTemporaryFile()
|
||||||
|
83 | f = tarfile.open("foo.tar")
|
||||||
|
84 | f = TarFile("foo.tar").open()
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^ SIM115
|
||||||
|
85 | f = tarfile.TarFile("foo.tar").open()
|
||||||
|
86 | f = tarfile.TarFile().open()
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:85:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
83 | f = tarfile.open("foo.tar")
|
||||||
|
84 | f = TarFile("foo.tar").open()
|
||||||
|
85 | f = tarfile.TarFile("foo.tar").open()
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ SIM115
|
||||||
|
86 | f = tarfile.TarFile().open()
|
||||||
|
87 | f = zipfile.ZipFile("foo.zip").open("foo.txt")
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:86:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
84 | f = TarFile("foo.tar").open()
|
||||||
|
85 | f = tarfile.TarFile("foo.tar").open()
|
||||||
|
86 | f = tarfile.TarFile().open()
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^ SIM115
|
||||||
|
87 | f = zipfile.ZipFile("foo.zip").open("foo.txt")
|
||||||
|
88 | f = io.open("foo.txt")
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:87:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
85 | f = tarfile.TarFile("foo.tar").open()
|
||||||
|
86 | f = tarfile.TarFile().open()
|
||||||
|
87 | f = zipfile.ZipFile("foo.zip").open("foo.txt")
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ SIM115
|
||||||
|
88 | f = io.open("foo.txt")
|
||||||
|
89 | f = io.open_code("foo.txt")
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:88:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
86 | f = tarfile.TarFile().open()
|
||||||
|
87 | f = zipfile.ZipFile("foo.zip").open("foo.txt")
|
||||||
|
88 | f = io.open("foo.txt")
|
||||||
|
| ^^^^^^^ SIM115
|
||||||
|
89 | f = io.open_code("foo.txt")
|
||||||
|
90 | f = codecs.open("foo.txt")
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:89:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
87 | f = zipfile.ZipFile("foo.zip").open("foo.txt")
|
||||||
|
88 | f = io.open("foo.txt")
|
||||||
|
89 | f = io.open_code("foo.txt")
|
||||||
|
| ^^^^^^^^^^^^ SIM115
|
||||||
|
90 | f = codecs.open("foo.txt")
|
||||||
|
91 | f = bz2.open("foo.txt")
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:90:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
88 | f = io.open("foo.txt")
|
||||||
|
89 | f = io.open_code("foo.txt")
|
||||||
|
90 | f = codecs.open("foo.txt")
|
||||||
|
| ^^^^^^^^^^^ SIM115
|
||||||
|
91 | f = bz2.open("foo.txt")
|
||||||
|
92 | f = gzip.open("foo.txt")
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:91:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
89 | f = io.open_code("foo.txt")
|
||||||
|
90 | f = codecs.open("foo.txt")
|
||||||
|
91 | f = bz2.open("foo.txt")
|
||||||
|
| ^^^^^^^^ SIM115
|
||||||
|
92 | f = gzip.open("foo.txt")
|
||||||
|
93 | f = dbm.open("foo.db")
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:92:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
90 | f = codecs.open("foo.txt")
|
||||||
|
91 | f = bz2.open("foo.txt")
|
||||||
|
92 | f = gzip.open("foo.txt")
|
||||||
|
| ^^^^^^^^^ SIM115
|
||||||
|
93 | f = dbm.open("foo.db")
|
||||||
|
94 | f = dbm.gnu.open("foo.db")
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:93:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
91 | f = bz2.open("foo.txt")
|
||||||
|
92 | f = gzip.open("foo.txt")
|
||||||
|
93 | f = dbm.open("foo.db")
|
||||||
|
| ^^^^^^^^ SIM115
|
||||||
|
94 | f = dbm.gnu.open("foo.db")
|
||||||
|
95 | f = dbm.ndbm.open("foo.db")
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:94:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
92 | f = gzip.open("foo.txt")
|
||||||
|
93 | f = dbm.open("foo.db")
|
||||||
|
94 | f = dbm.gnu.open("foo.db")
|
||||||
|
| ^^^^^^^^^^^^ SIM115
|
||||||
|
95 | f = dbm.ndbm.open("foo.db")
|
||||||
|
96 | f = dbm.dumb.open("foo.db")
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:95:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
93 | f = dbm.open("foo.db")
|
||||||
|
94 | f = dbm.gnu.open("foo.db")
|
||||||
|
95 | f = dbm.ndbm.open("foo.db")
|
||||||
|
| ^^^^^^^^^^^^^ SIM115
|
||||||
|
96 | f = dbm.dumb.open("foo.db")
|
||||||
|
97 | f = lzma.open("foo.xz")
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:96:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
94 | f = dbm.gnu.open("foo.db")
|
||||||
|
95 | f = dbm.ndbm.open("foo.db")
|
||||||
|
96 | f = dbm.dumb.open("foo.db")
|
||||||
|
| ^^^^^^^^^^^^^ SIM115
|
||||||
|
97 | f = lzma.open("foo.xz")
|
||||||
|
98 | f = lzma.LZMAFile("foo.xz")
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:97:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
95 | f = dbm.ndbm.open("foo.db")
|
||||||
|
96 | f = dbm.dumb.open("foo.db")
|
||||||
|
97 | f = lzma.open("foo.xz")
|
||||||
|
| ^^^^^^^^^ SIM115
|
||||||
|
98 | f = lzma.LZMAFile("foo.xz")
|
||||||
|
99 | f = shelve.open("foo.db")
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:98:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
96 | f = dbm.dumb.open("foo.db")
|
||||||
|
97 | f = lzma.open("foo.xz")
|
||||||
|
98 | f = lzma.LZMAFile("foo.xz")
|
||||||
|
| ^^^^^^^^^^^^^ SIM115
|
||||||
|
99 | f = shelve.open("foo.db")
|
||||||
|
100 | f = tokenize.open("foo.py")
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:99:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
97 | f = lzma.open("foo.xz")
|
||||||
|
98 | f = lzma.LZMAFile("foo.xz")
|
||||||
|
99 | f = shelve.open("foo.db")
|
||||||
|
| ^^^^^^^^^^^ SIM115
|
||||||
|
100 | f = tokenize.open("foo.py")
|
||||||
|
101 | f = wave.open("foo.wav")
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:100:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
98 | f = lzma.LZMAFile("foo.xz")
|
||||||
|
99 | f = shelve.open("foo.db")
|
||||||
|
100 | f = tokenize.open("foo.py")
|
||||||
|
| ^^^^^^^^^^^^^ SIM115
|
||||||
|
101 | f = wave.open("foo.wav")
|
||||||
|
102 | f = tarfile.TarFile.taropen("foo.tar")
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:101:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
99 | f = shelve.open("foo.db")
|
||||||
|
100 | f = tokenize.open("foo.py")
|
||||||
|
101 | f = wave.open("foo.wav")
|
||||||
|
| ^^^^^^^^^ SIM115
|
||||||
|
102 | f = tarfile.TarFile.taropen("foo.tar")
|
||||||
|
103 | f = fileinput.input("foo.txt")
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:102:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
100 | f = tokenize.open("foo.py")
|
||||||
|
101 | f = wave.open("foo.wav")
|
||||||
|
102 | f = tarfile.TarFile.taropen("foo.tar")
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^ SIM115
|
||||||
|
103 | f = fileinput.input("foo.txt")
|
||||||
|
104 | f = fileinput.FileInput("foo.txt")
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:103:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
101 | f = wave.open("foo.wav")
|
||||||
|
102 | f = tarfile.TarFile.taropen("foo.tar")
|
||||||
|
103 | f = fileinput.input("foo.txt")
|
||||||
|
| ^^^^^^^^^^^^^^^ SIM115
|
||||||
|
104 | f = fileinput.FileInput("foo.txt")
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:104:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
102 | f = tarfile.TarFile.taropen("foo.tar")
|
||||||
|
103 | f = fileinput.input("foo.txt")
|
||||||
|
104 | f = fileinput.FileInput("foo.txt")
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^ SIM115
|
||||||
|
105 |
|
||||||
|
106 | with contextlib.suppress(Exception):
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:240:9: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
238 | def aliased():
|
||||||
|
239 | from shelve import open as open_shelf
|
||||||
|
240 | x = open_shelf("foo.dbm")
|
||||||
|
| ^^^^^^^^^^ SIM115
|
||||||
|
241 | x.close()
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:244:9: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
243 | from tarfile import TarFile as TF
|
||||||
|
244 | f = TF("foo").open()
|
||||||
|
| ^^^^^^^^^^^^^^ SIM115
|
||||||
|
245 | f.close()
|
||||||
|
|
|
||||||
|
|
||||||
|
SIM115.py:257:5: SIM115 Use a context manager for opening files
|
||||||
|
|
|
||||||
|
256 | # SIM115
|
||||||
|
257 | f = dbm.sqlite3.open("foo.db")
|
||||||
|
| ^^^^^^^^^^^^^^^^ SIM115
|
||||||
|
258 | f.close()
|
||||||
|
|
|
||||||
|
|
|
@ -1,334 +0,0 @@
|
||||||
---
|
|
||||||
source: crates/ruff_linter/src/rules/flake8_simplify/mod.rs
|
|
||||||
---
|
|
||||||
SIM115.py:8:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
7 | # SIM115
|
|
||||||
8 | f = open("foo.txt")
|
|
||||||
| ^^^^ SIM115
|
|
||||||
9 | f = Path("foo.txt").open()
|
|
||||||
10 | f = pathlib.Path("foo.txt").open()
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:9:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
7 | # SIM115
|
|
||||||
8 | f = open("foo.txt")
|
|
||||||
9 | f = Path("foo.txt").open()
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^ SIM115
|
|
||||||
10 | f = pathlib.Path("foo.txt").open()
|
|
||||||
11 | f = pl.Path("foo.txt").open()
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:10:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
8 | f = open("foo.txt")
|
|
||||||
9 | f = Path("foo.txt").open()
|
|
||||||
10 | f = pathlib.Path("foo.txt").open()
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ SIM115
|
|
||||||
11 | f = pl.Path("foo.txt").open()
|
|
||||||
12 | f = P("foo.txt").open()
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:11:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
9 | f = Path("foo.txt").open()
|
|
||||||
10 | f = pathlib.Path("foo.txt").open()
|
|
||||||
11 | f = pl.Path("foo.txt").open()
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^ SIM115
|
|
||||||
12 | f = P("foo.txt").open()
|
|
||||||
13 | data = f.read()
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:12:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
10 | f = pathlib.Path("foo.txt").open()
|
|
||||||
11 | f = pl.Path("foo.txt").open()
|
|
||||||
12 | f = P("foo.txt").open()
|
|
||||||
| ^^^^^^^^^^^^^^^^^ SIM115
|
|
||||||
13 | data = f.read()
|
|
||||||
14 | f.close()
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:39:9: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
37 | # SIM115
|
|
||||||
38 | with contextlib.ExitStack():
|
|
||||||
39 | f = open("filename")
|
|
||||||
| ^^^^ SIM115
|
|
||||||
40 |
|
|
||||||
41 | # OK
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:80:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
78 | import fileinput
|
|
||||||
79 |
|
|
||||||
80 | f = tempfile.NamedTemporaryFile()
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ SIM115
|
|
||||||
81 | f = tempfile.TemporaryFile()
|
|
||||||
82 | f = tempfile.SpooledTemporaryFile()
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:81:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
80 | f = tempfile.NamedTemporaryFile()
|
|
||||||
81 | f = tempfile.TemporaryFile()
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^ SIM115
|
|
||||||
82 | f = tempfile.SpooledTemporaryFile()
|
|
||||||
83 | f = tarfile.open("foo.tar")
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:82:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
80 | f = tempfile.NamedTemporaryFile()
|
|
||||||
81 | f = tempfile.TemporaryFile()
|
|
||||||
82 | f = tempfile.SpooledTemporaryFile()
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ SIM115
|
|
||||||
83 | f = tarfile.open("foo.tar")
|
|
||||||
84 | f = TarFile("foo.tar").open()
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:83:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
81 | f = tempfile.TemporaryFile()
|
|
||||||
82 | f = tempfile.SpooledTemporaryFile()
|
|
||||||
83 | f = tarfile.open("foo.tar")
|
|
||||||
| ^^^^^^^^^^^^ SIM115
|
|
||||||
84 | f = TarFile("foo.tar").open()
|
|
||||||
85 | f = tarfile.TarFile("foo.tar").open()
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:84:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
82 | f = tempfile.SpooledTemporaryFile()
|
|
||||||
83 | f = tarfile.open("foo.tar")
|
|
||||||
84 | f = TarFile("foo.tar").open()
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^ SIM115
|
|
||||||
85 | f = tarfile.TarFile("foo.tar").open()
|
|
||||||
86 | f = tarfile.TarFile().open()
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:85:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
83 | f = tarfile.open("foo.tar")
|
|
||||||
84 | f = TarFile("foo.tar").open()
|
|
||||||
85 | f = tarfile.TarFile("foo.tar").open()
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ SIM115
|
|
||||||
86 | f = tarfile.TarFile().open()
|
|
||||||
87 | f = zipfile.ZipFile("foo.zip").open("foo.txt")
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:86:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
84 | f = TarFile("foo.tar").open()
|
|
||||||
85 | f = tarfile.TarFile("foo.tar").open()
|
|
||||||
86 | f = tarfile.TarFile().open()
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^ SIM115
|
|
||||||
87 | f = zipfile.ZipFile("foo.zip").open("foo.txt")
|
|
||||||
88 | f = io.open("foo.txt")
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:87:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
85 | f = tarfile.TarFile("foo.tar").open()
|
|
||||||
86 | f = tarfile.TarFile().open()
|
|
||||||
87 | f = zipfile.ZipFile("foo.zip").open("foo.txt")
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ SIM115
|
|
||||||
88 | f = io.open("foo.txt")
|
|
||||||
89 | f = io.open_code("foo.txt")
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:88:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
86 | f = tarfile.TarFile().open()
|
|
||||||
87 | f = zipfile.ZipFile("foo.zip").open("foo.txt")
|
|
||||||
88 | f = io.open("foo.txt")
|
|
||||||
| ^^^^^^^ SIM115
|
|
||||||
89 | f = io.open_code("foo.txt")
|
|
||||||
90 | f = codecs.open("foo.txt")
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:89:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
87 | f = zipfile.ZipFile("foo.zip").open("foo.txt")
|
|
||||||
88 | f = io.open("foo.txt")
|
|
||||||
89 | f = io.open_code("foo.txt")
|
|
||||||
| ^^^^^^^^^^^^ SIM115
|
|
||||||
90 | f = codecs.open("foo.txt")
|
|
||||||
91 | f = bz2.open("foo.txt")
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:90:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
88 | f = io.open("foo.txt")
|
|
||||||
89 | f = io.open_code("foo.txt")
|
|
||||||
90 | f = codecs.open("foo.txt")
|
|
||||||
| ^^^^^^^^^^^ SIM115
|
|
||||||
91 | f = bz2.open("foo.txt")
|
|
||||||
92 | f = gzip.open("foo.txt")
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:91:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
89 | f = io.open_code("foo.txt")
|
|
||||||
90 | f = codecs.open("foo.txt")
|
|
||||||
91 | f = bz2.open("foo.txt")
|
|
||||||
| ^^^^^^^^ SIM115
|
|
||||||
92 | f = gzip.open("foo.txt")
|
|
||||||
93 | f = dbm.open("foo.db")
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:92:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
90 | f = codecs.open("foo.txt")
|
|
||||||
91 | f = bz2.open("foo.txt")
|
|
||||||
92 | f = gzip.open("foo.txt")
|
|
||||||
| ^^^^^^^^^ SIM115
|
|
||||||
93 | f = dbm.open("foo.db")
|
|
||||||
94 | f = dbm.gnu.open("foo.db")
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:93:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
91 | f = bz2.open("foo.txt")
|
|
||||||
92 | f = gzip.open("foo.txt")
|
|
||||||
93 | f = dbm.open("foo.db")
|
|
||||||
| ^^^^^^^^ SIM115
|
|
||||||
94 | f = dbm.gnu.open("foo.db")
|
|
||||||
95 | f = dbm.ndbm.open("foo.db")
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:94:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
92 | f = gzip.open("foo.txt")
|
|
||||||
93 | f = dbm.open("foo.db")
|
|
||||||
94 | f = dbm.gnu.open("foo.db")
|
|
||||||
| ^^^^^^^^^^^^ SIM115
|
|
||||||
95 | f = dbm.ndbm.open("foo.db")
|
|
||||||
96 | f = dbm.dumb.open("foo.db")
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:95:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
93 | f = dbm.open("foo.db")
|
|
||||||
94 | f = dbm.gnu.open("foo.db")
|
|
||||||
95 | f = dbm.ndbm.open("foo.db")
|
|
||||||
| ^^^^^^^^^^^^^ SIM115
|
|
||||||
96 | f = dbm.dumb.open("foo.db")
|
|
||||||
97 | f = lzma.open("foo.xz")
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:96:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
94 | f = dbm.gnu.open("foo.db")
|
|
||||||
95 | f = dbm.ndbm.open("foo.db")
|
|
||||||
96 | f = dbm.dumb.open("foo.db")
|
|
||||||
| ^^^^^^^^^^^^^ SIM115
|
|
||||||
97 | f = lzma.open("foo.xz")
|
|
||||||
98 | f = lzma.LZMAFile("foo.xz")
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:97:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
95 | f = dbm.ndbm.open("foo.db")
|
|
||||||
96 | f = dbm.dumb.open("foo.db")
|
|
||||||
97 | f = lzma.open("foo.xz")
|
|
||||||
| ^^^^^^^^^ SIM115
|
|
||||||
98 | f = lzma.LZMAFile("foo.xz")
|
|
||||||
99 | f = shelve.open("foo.db")
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:98:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
96 | f = dbm.dumb.open("foo.db")
|
|
||||||
97 | f = lzma.open("foo.xz")
|
|
||||||
98 | f = lzma.LZMAFile("foo.xz")
|
|
||||||
| ^^^^^^^^^^^^^ SIM115
|
|
||||||
99 | f = shelve.open("foo.db")
|
|
||||||
100 | f = tokenize.open("foo.py")
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:99:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
97 | f = lzma.open("foo.xz")
|
|
||||||
98 | f = lzma.LZMAFile("foo.xz")
|
|
||||||
99 | f = shelve.open("foo.db")
|
|
||||||
| ^^^^^^^^^^^ SIM115
|
|
||||||
100 | f = tokenize.open("foo.py")
|
|
||||||
101 | f = wave.open("foo.wav")
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:100:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
98 | f = lzma.LZMAFile("foo.xz")
|
|
||||||
99 | f = shelve.open("foo.db")
|
|
||||||
100 | f = tokenize.open("foo.py")
|
|
||||||
| ^^^^^^^^^^^^^ SIM115
|
|
||||||
101 | f = wave.open("foo.wav")
|
|
||||||
102 | f = tarfile.TarFile.taropen("foo.tar")
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:101:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
99 | f = shelve.open("foo.db")
|
|
||||||
100 | f = tokenize.open("foo.py")
|
|
||||||
101 | f = wave.open("foo.wav")
|
|
||||||
| ^^^^^^^^^ SIM115
|
|
||||||
102 | f = tarfile.TarFile.taropen("foo.tar")
|
|
||||||
103 | f = fileinput.input("foo.txt")
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:102:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
100 | f = tokenize.open("foo.py")
|
|
||||||
101 | f = wave.open("foo.wav")
|
|
||||||
102 | f = tarfile.TarFile.taropen("foo.tar")
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^ SIM115
|
|
||||||
103 | f = fileinput.input("foo.txt")
|
|
||||||
104 | f = fileinput.FileInput("foo.txt")
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:103:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
101 | f = wave.open("foo.wav")
|
|
||||||
102 | f = tarfile.TarFile.taropen("foo.tar")
|
|
||||||
103 | f = fileinput.input("foo.txt")
|
|
||||||
| ^^^^^^^^^^^^^^^ SIM115
|
|
||||||
104 | f = fileinput.FileInput("foo.txt")
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:104:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
102 | f = tarfile.TarFile.taropen("foo.tar")
|
|
||||||
103 | f = fileinput.input("foo.txt")
|
|
||||||
104 | f = fileinput.FileInput("foo.txt")
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^ SIM115
|
|
||||||
105 |
|
|
||||||
106 | with contextlib.suppress(Exception):
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:240:9: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
238 | def aliased():
|
|
||||||
239 | from shelve import open as open_shelf
|
|
||||||
240 | x = open_shelf("foo.dbm")
|
|
||||||
| ^^^^^^^^^^ SIM115
|
|
||||||
241 | x.close()
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:244:9: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
243 | from tarfile import TarFile as TF
|
|
||||||
244 | f = TF("foo").open()
|
|
||||||
| ^^^^^^^^^^^^^^ SIM115
|
|
||||||
245 | f.close()
|
|
||||||
|
|
|
||||||
|
|
||||||
SIM115.py:257:5: SIM115 Use a context manager for opening files
|
|
||||||
|
|
|
||||||
256 | # SIM115
|
|
||||||
257 | f = dbm.sqlite3.open("foo.db")
|
|
||||||
| ^^^^^^^^^^^^^^^^ SIM115
|
|
||||||
258 | f.close()
|
|
||||||
|
|
|
Loading…
Add table
Add a link
Reference in a new issue