• Kirill Smelkov's avatar
    Add custom Dict that mirrors Python dict behaviour · 3fa0108e
    Kirill Smelkov authored
    Ogórek currently represents unpickled dict via map[any]any, which is
    logical, but also exhibits issues because builtin Go map behaviour is
    different from Python's dict behaviour. For example:
    
    - Python's dict allows tuples to be used in keys, while Go map
      does not (https://github.com/kisielk/og-rek/issues/50),
    
    - Python's dict allows both long and int to be used interchangeable as
      keys, while Go map does not handle *big.Int as key with the same
      semantic (https://github.com/kisielk/og-rek/issues/55)
    
    - Python's dict allows to use numbers interchangeable in keys - all int
      and float, but on Go side int(1) and float64(1.0) are considered by
      builtin map as different keys.
    
    - In Python world bytestring (str from py2) is considered to be related
      to both unicode (str on py3) and bytes, but builtin map considers all
      string, Bytes and ByteString as different keys.
    
    - etc...
    
    All in all there are many differences in behaviour in builtin Python
    dict and Go map that result in generally different semantics when
    decoding pickled data. Those differences can be fixed only if we add
    custom dict implementation that mirrors what Python does.
    
    -> Do that: add custom Dict that implements key -> value mapping with
       mirroring Python behaviour.
    
    For now we are only adding the Dict class itself and its tests.
    Later we will use this new Dict to handle decoding dictionaries from the pickles.
    
    For the implementation we use github.com/aristanetworks/gomap which
    provides extraction of builtin go map code wrapped into generic type
    Map[Key,Value] that accepts custom equal and hash functions. And it is
    those equal and hash functions via which we define equality behaviour to
    be the same as on Python side.
    
    Please see documentation in the added code and tests for details.
    3fa0108e
dict.go 17.6 KB