Avoid triggering PD errors on method calls (#1537)

This commit is contained in:
Charlie Marsh 2023-01-01 17:00:17 -05:00 committed by GitHub
parent 65c34c56d6
commit 2cf6d05586
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 7 additions and 9 deletions

3
foo.py
View file

@ -1,3 +0,0 @@
import mock.mock
x = mock.mock.Mock()

View file

@ -1629,6 +1629,11 @@ where
] { ] {
if self.settings.enabled.contains(&code) { if self.settings.enabled.contains(&code) {
if attr == name { if attr == name {
if let Some(parent) = self.current_expr_parent() {
if matches!(parent.0.node, ExprKind::Call { .. }) {
continue;
}
}
self.add_check(Check::new(code.kind(), Range::from_located(expr))); self.add_check(Check::new(code.kind(), Range::from_located(expr)));
}; };
} }

View file

@ -81,8 +81,7 @@ mod tests {
#[test_case("result = df.to_array()", &[]; "PD011_pass_to_array")] #[test_case("result = df.to_array()", &[]; "PD011_pass_to_array")]
#[test_case("result = df.array", &[]; "PD011_pass_array")] #[test_case("result = df.array", &[]; "PD011_pass_array")]
#[test_case("result = df.values", &[CheckCode::PD011]; "PD011_fail_values")] #[test_case("result = df.values", &[CheckCode::PD011]; "PD011_fail_values")]
// TODO(edgarrmondragon): Check that the attribute access is NOT a method call. #[test_case("result = {}.values()", &[]; "PD011_pass_values_call")]
// #[test_case("result = {}.values()", &[]; "PD011_pass_values_call")]
#[test_case("result = values", &[]; "PD011_pass_node_name")] #[test_case("result = values", &[]; "PD011_pass_node_name")]
#[test_case("employees = pd.read_csv(input_file)", &[]; "PD012_pass_read_csv")] #[test_case("employees = pd.read_csv(input_file)", &[]; "PD012_pass_read_csv")]
#[test_case("employees = pd.read_table(input_file)", &[CheckCode::PD012]; "PD012_fail_read_table")] #[test_case("employees = pd.read_table(input_file)", &[CheckCode::PD012]; "PD012_fail_read_table")]

View file

@ -17,10 +17,7 @@ fn contains_await(expr: &Expr) -> bool {
ExprKind::IfExp { test, body, orelse } => { ExprKind::IfExp { test, body, orelse } => {
contains_await(test) || contains_await(body) || contains_await(orelse) contains_await(test) || contains_await(body) || contains_await(orelse)
} }
ExprKind::Dict { keys, values } => keys ExprKind::Dict { keys, values } => keys.iter().chain(values.iter()).any(contains_await),
.iter()
.chain(values.iter())
.any(contains_await),
ExprKind::Set { elts } => elts.iter().any(contains_await), ExprKind::Set { elts } => elts.iter().any(contains_await),
ExprKind::ListComp { elt, .. } => contains_await(elt), ExprKind::ListComp { elt, .. } => contains_await(elt),
ExprKind::SetComp { elt, .. } => contains_await(elt), ExprKind::SetComp { elt, .. } => contains_await(elt),