Согласно предложению Дюны, я просто полностью отбросил концепцию int
.Как он указал, любой ванильный объект может неявно использоваться в качестве уникального ключа!
На самом деле MyId
можно определить просто: class MyId: pass
.Зачастую это был бы - совершенно удобный, неявно уникальный ключ!
Однако для моего случая использования мне нужно передавать эти ключи взад и вперед через подпроцессы (через multiprocessing
очереди).У меня возникли проблемы с этим сверхлегким подходом, так как значение хеш-функции могло бы измениться, когда объекты подвергались травлению и проталкиванию между процессами.Второстепенная второстепенная проблема заключалась в том, что я хотел сделать эти объекты простыми для регистрации и ручного считывания / сопоставления через журналы.Таким образом, я пошел с этим:
class _MyIdPrivate: pass
class MyId :
def __init__( self ):
self.__priv = _MyIdPrivate()
self.__i = hash( self.__priv )
def __str__( self ): return str( self.__i )
def __hash__( self ): return self.__i
def __eq__( self, other ):
try: return self.__i == other.__i
except: return False
class MyCollection :
def __init__( self ):
self.__objs={}
def uniqueId( self ): return MyId()
def push( self, i, obj ):
self.__objs[ i ] = obj
def pop( self, i ):
return self.__objs.pop( i, None )
c = MyCollection()
uId = c.uniqueId()
print "uId", uId
print "isinstance", isinstance(uId, MyId)
c.push( uId, "A" )
print c.pop( MyId() )
print c.pop( uId )
Как вы можете видеть, я обернул короткий и приятный подход в более всеобъемлющий / подробный.Когда я создаю объект MyId, я создаю член _MyIdPrivate и получаю его хэш в этот момент создания.При подборе и перемещении по подпроектам этот хеш _MyIdPrivate изменится - но это не имеет значения, потому что я захватил начальное значение, и все заканчивается тем, что от него отказываются.
Основным преимуществом этого подхода по сравнению с первоначальным планом int
является то, что я получаю уникальный ключ без "вычисления" или назначения его напрямую.
Как и предполагал Дюны, я мог бы также использовать uuid.Я вижу плюсы и минусы этого против этого ...