Avoid flagging redundant open modes when open is rebound (#918)

This commit is contained in:
Charlie Marsh 2022-11-26 16:24:41 -05:00 committed by GitHub
parent 721a1e9443
commit 1a2559b001
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 1 deletions

View File

@ -68,3 +68,13 @@ open(file="foo", mode='Ub', buffering=- 1, encoding=None, errors=None, newline=N
open(file="foo", buffering=- 1, encoding=None, errors=None, newline=None, closefd=True, opener=None, mode='Ub') open(file="foo", buffering=- 1, encoding=None, errors=None, newline=None, closefd=True, opener=None, mode='Ub')
open(file="foo", buffering=- 1, encoding=None, errors=None, mode='Ub', newline=None, closefd=True, opener=None) open(file="foo", buffering=- 1, encoding=None, errors=None, mode='Ub', newline=None, closefd=True, opener=None)
open(mode='Ub', file="foo", buffering=- 1, encoding=None, errors=None, newline=None, closefd=True, opener=None) open(mode='Ub', file="foo", buffering=- 1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
open = 1
open("foo", "U")
open("foo", "Ur")
open("foo", "Ub")
open("foo", "rUb")
open("foo", "r")
open("foo", "rt")
open("f", "r", encoding="UTF-8")
open("f", "wt")

View File

@ -64,7 +64,6 @@ fn match_open(expr: &Expr) -> (Option<&Expr>, Vec<Keyword>) {
keywords, keywords,
} = &expr.node } = &expr.node
{ {
// TODO(andberger): Verify that "open" is still bound to the built-in function.
if match_name_or_attr(func, OPEN_FUNC_NAME) { if match_name_or_attr(func, OPEN_FUNC_NAME) {
// Return the "open mode" parameter and keywords. // Return the "open mode" parameter and keywords.
return (args.get(1), keywords.clone()); return (args.get(1), keywords.clone());
@ -149,6 +148,10 @@ fn create_remove_param_fix(
/// U015 /// U015
pub fn redundant_open_modes(checker: &mut Checker, expr: &Expr) { pub fn redundant_open_modes(checker: &mut Checker, expr: &Expr) {
// If `open` has been rebound, skip this check entirely.
if !checker.is_builtin(OPEN_FUNC_NAME) {
return;
}
let (mode_param, keywords): (Option<&Expr>, Vec<Keyword>) = match_open(expr); let (mode_param, keywords): (Option<&Expr>, Vec<Keyword>) = match_open(expr);
if mode_param.is_none() && !keywords.is_empty() { if mode_param.is_none() && !keywords.is_empty() {
if let Some(value) = keywords.iter().find_map(|keyword| { if let Some(value) = keywords.iter().find_map(|keyword| {