Skip to main content

Python 2.7 hashing and iteration in Python 3+

Project description

py27hash: Python 2.7 hashing and iteration in Python 3+

Version Build Status Coverage Status

This package helps ease the migration from Python 2 to 3 for applications that depend on the old hash/iteration order of sets/dicts. Even when setting PYTHONHASHSEED=0, the hash (and default iteration order) will still be different as the hashing algorithm changed in Python 3. This package allows Python 2.7 hashing and set/dict iteration.

Installation

The easiest way to install is via pip and PyPI

pip install py27hash

You can also use Git to clone the repository from GitHub and install it manually:

git clone https://github.com/neuml/py27hash.git
cd py27hash
pip install .

Python 2.7 and 3+ are supported.

How to use

You only need to replace object instantiation to use this package. There are multiple ways to do this, with the best way to do it on a case by case basis.

Replace each instantiation

The first example replaces a single dict and set with a 2.7 dict.

from py27hash.dict import Dict

# Replace {} with Dict()
d = Dict()

d["a"] = 1

# Python 2.7 sets can be used in the same manner.

from py27hash.set import Set

# Replace set() with Set()
d = Set()

d.add("a")

Override function via import

The same example above can be changed to override the dict and set import statement. This will globally change an entire file which could cause issues but it is an option. If a dict or set was created with the {} syntax, it still needs to be changed to dict()/set().

from py27hash.dict import Dict as dict

d = dict()

d["a"] = 1

# Python 2.7 sets can be used in the same manner.
from py27hash.set import Set as set

d = set()

d.add("a")

Using other methods

The hashing and key iteration methods can be directly accessed via the hash and key packages as follows.

from py27hash.hash import hash27

print(hash27("test1234"))

# As with the example above you could even override the hash function for a particular file.

from p27hash.hash import hash27 as hash

print(hash("test1234"))

Both Dict and Set are backed by the keys class. As new values as added/modified, a Keys instance tracks each value to store the order via Python 2.7 hashing. This class can also be used directly.

from p27hash.key import Keys

keys = Keys()
keys.add("1")
keys.add("2")

Background

Python 2 will reach end of life (EOL) on January 1st, 2020. This package helps ease the migration from Python 2 to 3 for applications that depend on the old hash/iteration order of sets/dicts. Even when setting PYTHONHASHSEED=0, the hash (and default iteration order) will still be different as the hashing algorithm changed in Python3. Python 3.6 changed the default iteration order to insertion order.

One target use case is with machine learning. Optimization of machine learning model hyperparameters can take a very long time and if a model was built under Python 2 and feature set/dicts used the default sort order, new parameters would need to be used. This library can be used to allow a full conversion to Python 3 while fixes are made to re-optimize large model parameters. There likely are other use cases, especially in the scientific/engineering space where non-random deterministic iteration in Python 2 was used to create reproducible results.

This package implements logic in cpython 2.7 C source, mainly the Objects/ folder in pure Python. Performance was not a goal of this package and it will perform worse than native collections. It should only be used when there is a clear use case to preserve Python 2.7 hashing/iteration to ease a transition to Python 3.

Development

If an issue is found in this library, it can be cloned and changed.

git clone https://github.com/neuml/py27hash.git
cd py27hash

After changes are made to the source, unit tests should also be added and run via: scripts/test.sh

During development slower tests can be skipped via: scripts/test.sh skipslow

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

py27hash-1.0.2.tar.gz (8.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

py27hash-1.0.2-py3-none-any.whl (9.6 kB view details)

Uploaded Python 3

File details

Details for the file py27hash-1.0.2.tar.gz.

File metadata

  • Download URL: py27hash-1.0.2.tar.gz
  • Upload date:
  • Size: 8.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/42.0.2 requests-toolbelt/0.9.1 tqdm/4.40.2 CPython/3.7.5

File hashes

Hashes for py27hash-1.0.2.tar.gz
Algorithm Hash digest
SHA256 34f12148fa762dd7bc52896a2fec134c3fec09d4ffbbd612d7dfc8851a5f3043
MD5 4502182e2c540b7d5452537545cfd915
BLAKE2b-256 620d1b136a7e887d3c32050bf65ca7d2f4558178a55f7d4f5fd58e93e0572920

See more details on using hashes here.

File details

Details for the file py27hash-1.0.2-py3-none-any.whl.

File metadata

  • Download URL: py27hash-1.0.2-py3-none-any.whl
  • Upload date:
  • Size: 9.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/42.0.2 requests-toolbelt/0.9.1 tqdm/4.40.2 CPython/3.7.5

File hashes

Hashes for py27hash-1.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 c910e4b60f3f5befcf69bba0f97264c1f8b67972f2cf8eb8e7c7d5dcdedc3041
MD5 10d8b9a8e6f0374d3c4f71412d46919d
BLAKE2b-256 3e76a0f3ee8e656e12e16a09044cead5ccc0169f6932b5f46ae3feef908cea51

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page