Используйте третий аргумент getattr
для установки различных значений по умолчанию:
def __eq__(self, other):
return all(getattr(self, a, Ellipsis) == getattr(other, a, Ellipsis)
for a in self.metainfo)
В качестве значения по умолчанию установите то, что никогда не будет фактическим значением, например Ellipsis
& dagger; . Таким образом, значения будут совпадать, только если оба объекта содержат одно и то же значение для определенного атрибута или , если оба не имеют указанного атрибута.
Редактировать : как указывает Надя , NotImplemented
может быть более подходящей константой (если вы не сохраняете результат богатых сравнений). .).
Редактировать 2: Действительно, как указывает Lac , просто использование hasattr
приводит к более удобочитаемому решению:
def __eq__(self, other):
return all(hasattr(self, a) == hasattr(other, a) and
getattr(self, a) == getattr(other, a) for a in self.metainfo)
& dagger; : для большей неясности вы можете написать ...
вместо Ellipsis
, таким образом getattr(self, a, ...)
и т. Д. Нет, не делайте этого:)