Avoid false-positive on PLR1701 for multi-type isinstance calls (#1063)

This commit is contained in:
Charlie Marsh 2022-12-05 10:07:05 -05:00 committed by GitHub
parent fb2c457a9b
commit e695f6eb25
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 13 deletions

View file

@ -34,4 +34,5 @@ def isinstances():
result = isinstance(var[7], int) or not isinstance(var[7], float) result = isinstance(var[7], int) or not isinstance(var[7], float)
result = isinstance(var[6], int) or isinstance(var[7], float) result = isinstance(var[6], int) or isinstance(var[7], float)
result = isinstance(var[6], int) or isinstance(var[7], int) result = isinstance(var[6], int) or isinstance(var[7], int)
result = isinstance(var[6], (float, int)) or False
return result return result

View file

@ -18,29 +18,31 @@ pub fn consider_merging_isinstance(
return; return;
} }
let mut obj_to_types: FxHashMap<String, FxHashSet<String>> = FxHashMap::default(); let mut obj_to_types: FxHashMap<String, (usize, FxHashSet<String>)> = FxHashMap::default();
for value in values { for value in values {
if let ExprKind::Call { func, args, .. } = &value.node { if let ExprKind::Call { func, args, .. } = &value.node {
if matches!(&func.node, ExprKind::Name { id, .. } if id == "isinstance") { if matches!(&func.node, ExprKind::Name { id, .. } if id == "isinstance") {
if let [obj, types] = &args[..] { if let [obj, types] = &args[..] {
obj_to_types let (num_calls, matches) = obj_to_types
.entry(obj.to_string()) .entry(obj.to_string())
.or_insert_with(FxHashSet::default) .or_insert_with(|| (0, FxHashSet::default()));
.extend(match &types.node {
ExprKind::Tuple { elts, .. } => { *num_calls += 1;
elts.iter().map(std::string::ToString::to_string).collect() matches.extend(match &types.node {
} ExprKind::Tuple { elts, .. } => {
_ => { elts.iter().map(std::string::ToString::to_string).collect()
vec![types.to_string()] }
} _ => {
}); vec![types.to_string()]
}
});
} }
} }
} }
} }
for (obj, types) in obj_to_types { for (obj, (num_calls, types)) in obj_to_types {
if types.len() > 1 { if num_calls > 1 && types.len() > 1 {
checker.add_check(Check::new( checker.add_check(Check::new(
CheckKind::ConsiderMergingIsinstance(obj, types.into_iter().sorted().collect()), CheckKind::ConsiderMergingIsinstance(obj, types.into_iter().sorted().collect()),
Range::from_located(expr), Range::from_located(expr),