( EDITED : для устранения проблемы, из-за которой я неправильно предполагал, что изменение __eq__
в экземпляре повлияет на оценку ==
, как было предложено @ user2357112supportsMonica).
Обычно , вы бы сделали это, переопределив метод __eq__
того типа (ов), который вы хотите защитить. К сожалению для вас, это невозможно сделать для встроенных типов, в частности str
и bytes
, поэтому такой код:
foo = b'foo'
bytes.__eq__ = ... # a custom equal function
# str.__eq__ = ... # if it were 'foo' == foo (or `type(foo)`)
if foo == 'foo':
print("They match!")
просто выбросит:
AttributeError: 'bytes' object attribute '__eq__' is read-only
Возможно, вам потребуется вручную защитить сравнение с чем-то вроде:
def str_eq_bytes(x, y):
if isinstance(x, str) and isinstance(y, bytes):
raise TypeError("Comparison between `str` and `bytes` detected.")
elif isinstance(x, bytes) and isinstance(y, str):
raise TypeError("Comparison between `bytes` and `str` detected.")
, которое будет использоваться следующим образом:
foo = 'foo'
if str_eq_bytes(foo, 'foo') or foo == 'foo':
print("They match!")
# They match!
foo = 'bar'
if str_eq_bytes(foo, 'foo') or foo == 'foo':
print("They match!")
# <nothing gets printed>
foo = b'foo'
if str_eq_bytes(foo, 'foo') or foo == 'foo':
print("They match!")
TypeError: Comparison between `bytes` and `str` detected.
Другой вариант - взломать собственный Python форк и переопределить __eq__
. Обратите внимание, что Pypy также не позволяет вам переопределять методы для встроенных типов.