diff --git a/sourmash_lib/signature.py b/sourmash_lib/signature.py index f9f3d1d994..d5f72457aa 100644 --- a/sourmash_lib/signature.py +++ b/sourmash_lib/signature.py @@ -31,6 +31,17 @@ def __init__(self, email, minhash, name='', filename=''): self.minhash = minhash + def __hash__(self): + return hash(self.md5sum()) + + def __str__(self): + name = self.name() + md5pref = self.md5sum()[:8] + if name != md5pref: + return "SourmashSignature('{}', {})".format(name, md5pref) + return "SourmashSignature({})".format(md5pref) + __repr__ = __str__ + def md5sum(self): "Calculate md5 hash of the bottom sketch, specifically." m = hashlib.md5() diff --git a/tests/test_signature.py b/tests/test_signature.py index 0ec3db6475..257f0dd798 100644 --- a/tests/test_signature.py +++ b/tests/test_signature.py @@ -7,6 +7,33 @@ load_signatures, load_one_signature +def test_hashable(track_abundance): + # check: can we use signatures as keys in dictionaries and sets? + e = sourmash_lib.MinHash(n=1, ksize=20, track_abundance=track_abundance) + e.add("AT" * 10) + + sig = SourmashSignature('', e) + + x = set() + x.add(sig) + + +def test_str(track_abundance): + # signatures should be printable + e = sourmash_lib.MinHash(n=1, ksize=20, track_abundance=track_abundance) + e.add("AT" * 10) + + sig = SourmashSignature('', e) + + print(sig) + assert str(sig) == 'SourmashSignature(59502a74)' + assert repr(sig) == 'SourmashSignature(59502a74)' + + sig.d['name'] = 'fizbar' + assert str(sig) == 'SourmashSignature(\'fizbar\', 59502a74)' + assert repr(sig) == 'SourmashSignature(\'fizbar\', 59502a74)' + + def test_roundtrip(track_abundance): e = sourmash_lib.MinHash(n=1, ksize=20, track_abundance=track_abundance) e.add("AT" * 10)