From 1a2559b00154d155dddee55a01da728376e20eb7 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Sat, 26 Nov 2022 16:24:41 -0500 Subject: [PATCH] Avoid flagging redundant open modes when open is rebound (#918) --- resources/test/fixtures/U015.py | 10 ++++++++++ src/pyupgrade/plugins/redundant_open_modes.rs | 5 ++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/resources/test/fixtures/U015.py b/resources/test/fixtures/U015.py index e0cdb6321f..6fcc44d508 100644 --- a/resources/test/fixtures/U015.py +++ b/resources/test/fixtures/U015.py @@ -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, 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 = 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") diff --git a/src/pyupgrade/plugins/redundant_open_modes.rs b/src/pyupgrade/plugins/redundant_open_modes.rs index 6ec1a29510..e59ecae352 100644 --- a/src/pyupgrade/plugins/redundant_open_modes.rs +++ b/src/pyupgrade/plugins/redundant_open_modes.rs @@ -64,7 +64,6 @@ fn match_open(expr: &Expr) -> (Option<&Expr>, Vec) { keywords, } = &expr.node { - // TODO(andberger): Verify that "open" is still bound to the built-in function. if match_name_or_attr(func, OPEN_FUNC_NAME) { // Return the "open mode" parameter and keywords. return (args.get(1), keywords.clone()); @@ -149,6 +148,10 @@ fn create_remove_param_fix( /// U015 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) = match_open(expr); if mode_param.is_none() && !keywords.is_empty() { if let Some(value) = keywords.iter().find_map(|keyword| {