from collections import Hashable, defaultdict
def check(t: tuple):
try:
return len(set(t)) == len(t)
except TypeError:
tt = ([], [])
for e in t:
tt[isinstance(e, Hashable)].append(e)
if not check(tt[1]):
return False
d = defaultdict(list)
for e in tt[0]:
d[type(e)].append(e)
for l in d.values():
l.sort()
if any(a == b for a, b in zip(l, l[1:])):
return False
return True
print(check(([1], [1])))
print(check(([1], None)))
print(check(([1], {1})))
Но и это можно сломать, если в кортеже окажутся объекты типов, не поддерживающих методы сравнения. А можно и вовсе веселуху устроить:
def check(t: tuple):
return len(set(t)) == len(t)
class A:
def __hash__(self):
return 0
def __eq__(self, other):
return id(self) != id(other)
a, b = A(), A()
print(check((a, a)), a != a)
print(check((a, b)), a != b)
print(check((a, 1)), a != 1)