From d25349e8cf67384b961dc35f7764cf6e9f76b00e Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Tue, 10 Aug 2021 15:28:02 -0700 Subject: [PATCH] build: Use isinstance(other, Target) instead of hasattr In the comparison methods of Target. There are several problems with the old implementation: 1. It's not idiomatic 2. It can match on things that It shouldn't (like a Compiler, which has a `get_id() -> str` method, but not one that we should compare with Targets 3. It confuses mypy, which doesn't handle hasattr --- mesonbuild/build.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 9aad7a337..576bb0358 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -513,22 +513,22 @@ class Target(HoldableObject): raise RuntimeError(f'Target type is not set for target class "{type(self).__name__}". This is a bug') def __lt__(self, other: object) -> bool: - if not hasattr(other, 'get_id') and not callable(other.get_id): + if not isinstance(other, Target): return NotImplemented return self.get_id() < other.get_id() def __le__(self, other: object) -> bool: - if not hasattr(other, 'get_id') and not callable(other.get_id): + if not isinstance(other, Target): return NotImplemented return self.get_id() <= other.get_id() def __gt__(self, other: object) -> bool: - if not hasattr(other, 'get_id') and not callable(other.get_id): + if not isinstance(other, Target): return NotImplemented return self.get_id() > other.get_id() def __ge__(self, other: object) -> bool: - if not hasattr(other, 'get_id') and not callable(other.get_id): + if not isinstance(other, Target): return NotImplemented return self.get_id() >= other.get_id()