Skip to main content

Mutable variants of tuple (mutabletuple) and collections.namedtuple (recordclass), which support assignments and more memory saving variants (dataobject, litelist, ...).

Project description

Recordclass library

What is all about?

Recordclass is MIT Licensed python library. It implements the type mutabletuple and factory function recordclass in order to create record-like classes -- mutable variant of collection.namedtuple with the same API. Later more memory saving variants are added.

  • mutabletuple is mutable variant of the tuple, which supports assignment operations.
  • recordclass is a factory function that create a "mutable" analog of collection.namedtuple. It produces a subclass of mutabletuple with namedtuple-like API.
  • structclass is an analog of recordclass. It produces a class with less memory footprint (less than both recordclass-based class instances and instances of class with __slots__) and namedtuple-like API. It's instances has no __dict__, __weakref__ and don't support cyclic garbage collection by default (only reference counting). But structclass-created classes can support any of them.
  • arrayclass is factory function. It also produces a class with same memory footprint as structclass-created class instances. It implements an array of object. By default created class has no __dict__, __weakref__ and don't support cyclic garbage collection. But it can add support any of them.

Since 0.10

  • dataobject is new base class for creating subclasses, which are support the following properties by default 1) no __dict__ and __weakref__; 2) cyclic GC support is disabled by default; 3) instances have less memory size than class instances with __slots__.
  • make_class is a factory function for creation of dataobject subclasses described above.

The dataobject-based classes are not following namedtuple-like API, but attrs/dataclasses-like API. By default, subclasses of dataobject doesn't support cyclic GC, but only reference counting. As the result the instance of such class need less memory. The difference is equal to the size of PyGC_Head.

Subclasses of the dataobject are reasonable when reference cycles are not provided. For example, when all fields have values of atomic types (integer, float, strings, date and time, etc.). The field's value also may be the instance of a subclass of dataobject (i.e. without GC support). As an exception, the value of a field can be any object if our instance is not contained in this object and in its sub-objects.

The recordclass library was started as a "proof of concept" for the problem of fast "mutable" alternative of namedtuple (see question on stackoverflow). It was evolved further in order to provide more memory saving, fast and flexible types for representation of data objects.

Main repository for recordclass is on bitbucket.

Here is also a simple example.

Quick start:

Quick start with recordclass

First load inventory:

>>> from recordclass import recordclass, RecordClass

Example with recordclass:

>>> Point = recordclass('Point', 'x y')
>>> p = Point(1,2)
>>> print(p)
Point(1, 2)
>>> print(p.x, p.y)
1 2
>>> p.x, p.y = 10, 20
>>> print(p)
Point(10, 20)

Example with RecordClass and typehints::

class Point(RecordClass):
   x: int
   y: int

>>> ptint(Point.__annotations__)
{'x': <class 'int'>, 'y': <class 'int'>}
>>> p = Point(1, 2)
>>> print(p)
Point(1, 2)
>>> print(p.x, p.y)
1 2
>>> p.x, p.y = 10, 20
>>> print(p)
Point(10, 20)

Quick start with dataobject

First load inventory::

>>> from recordclass import dataobject, asdict

class Point(dataobject):
    x: int
    y: int

>>> print(Point.__annotations__)
{'x': <class 'int'>, 'y': <class 'int'>}

>>> p = Point(1,2)
>>> print(p)
Point(x=1, y=2)

>>> sys.getsizeof() # the output below is for 64bit python
32
>>> p.__sizeof__() == sys.getsizeof(p) # no additional space used by GC
True    

>>> p.x, p.y = 10, 20
>>> print(p)
Point(x=10, y=20)

>>> print(iter(p))
[1, 2]

>>> asdict(p)
{'x':1, 'y':2}

Another way – factory function make_dataclass:

>>> from recordclass import make_dataclass

>>> Point = make_dataclass("Point", [("x",int), ("y",int)])

Default values are also supported::

class CPoint(dataobject):
    x: int
    y: int
    color: str = 'white'

or

>>> Point = make_dataclass("Point", [("x",int), ("y",int), ("color",str)], defaults=("white",))

>>> p = CPoint(1,2)
>>> print(p.x, p.y, p.color)
1 2 'white'
>>> print(p)
Point(x=1, y=2, color='white')

Recordclasses and dataobject-based classes may be cached in order to reuse them without duplication::

from recordclass import RecordclassStorage

>>> rs = RecordclassStorage()
>>> A = rs.recordclass("A", "x y")
>>> B = rs.recordclass("A", ["x", "y"])
>>> A is B
True

from recordclass import DataclassStorage

>>> ds = DataclassStorage()
>>> A = ds.make_dataclass("A", "x y")
>>> B = ds.make_dataclass("A", ["x", "y"])
>>> A is B
True

Recordclass

Recordclass was created as answer to question on stackoverflow.com.

Recordclass was designed and implemented as a type that, by api, memory footprint, and speed, would be almost identical to namedtuple, except that it would support assignments that could replace any element without creating a new instance, as in namedtuple (support assignments __setitem__ / setslice__).

The effectiveness of a namedtuple is based on the effectiveness of the tuple type in python. In order to achieve the same efficiency, it was created the type mutabletuple. The structure (PymutabletupleObject) is identical to the structure of the tuple (PyTupleObject) and therefore occupies the same amount of memory as tuple.

Recordclass is defined on top of mutabletuple in the same way as namedtuple defined on top of tuple. Attributes are accessed via a descriptor (itemgetset), which provides quick access and assignment by attribute index.

The class generated by recordclass looks like::

from recordclass import mutabletuple, itemgetset

class C(mutabletuple, metaclass=recordobject):

    __fields__ = ('attr_1',...,'attr_m')

    attr_1 = itemgetset(0)
    ...
    attr_m = itemgetset(m-1)

    def __new__(cls, attr_1, ..., attr_m):
        'Create new instance of C(attr_1, ..., attr_m)'
        return mutabletuple.__new__(cls, attr_1, ..., attr_m)

etc. following the definition scheme of namedtuple.

As a result, recordclass takes up as much memory as namedtuple, supports fast access by __getitem__ / __setitem__ and by the name of the attribute through the descriptor protocol.

Structclass

In the discussions, it was correctly noted that instances of classes with __slots__ also support fast access to the object fields and take up less memory than tuple and instances of classes created using the factory function recordclass. This happens because instances of classes with __slots__ do not store the number of elements, like tuple and others (PyObjectVar), but they store the number of elements and the list of attributes in their type ( PyHeapTypeObject).

Therefore, a special class prototype was created from which, using a special metaclass structclasstype, classes can be created, instances of which can occupy as much in memory as instances of classes with __slots__, but do not use __slots__ at all. Based on this, the factory function structclass can create classes, instances of which are all similar to instances created using recordclass, but taking up less memory space.

The class generated by structclass looks like::

from recordclass import recordobjectgetset, structclasstype

class C(recordobject, metaclass=structclasstype):

    __attrs__ = ('attr_1',...,'attr_m')

    attr_1 = recordobjectgetset(0)
    ...
    attr_m = recordobjectgetset(m-1)

    def __new__(cls, attr_1, ..., attr_m):
        'Create new instance of C(attr_1, ..., attr_m)'
        return recordobject.__new__(cls, attr_1, ..., attr_m)

etc. following the definition scheme of recordclass.

As a result, structclass-based objects takes up as much memory as __slots__-based instances and also have same functionality as recordclass-created instances.

Comparisons

The following table explain memory footprints of recordclass-, recordclass2-base objects:

namedtuple class/__slots__ recordclass structclass
b+s+n*p b+n*p b+s+n*p b+n*p-g

where:

  • b = sizeof(PyObject)
  • s = sizeof(Py_ssize_t)
  • n = number of items
  • p = sizeof(PyObject*)
  • g = sizeof(PyGC_Head)

Special option cyclic_gc=False (by default) of structclass allows to disable support of the cyclic garbage collection. This is useful in that case when you absolutely sure that reference cycle isn't possible. For example, when all field values are instances of atomic types. As a result the size of the instance is decreased by 24 bytes::

class S:
    __slots__ = ('a','b','c')
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

R_gc = recordclass2('R_gc', 'a b c', cyclic_gc=True)
R_nogc = recordclass2('R_nogc', 'a b c')

s = S(1,2,3)
r_gc = R_gc(1,2,3) 
r_nogc = R_nogc(1,2,3)
for o in (s, r_gc, r_nogc):
    print(sys.getsizeof(o))
64 64 40

Here are also table with some performance counters:

namedtuple class/__slots__ recordclass structclass
new 739±24 ns 915±35 ns 763±21 ns 889±34 ns
getattr 84.0±1.7 ns 42.8±1.5 ns 39.5±1.0 ns 41.7±1.1 ns
setattr 50.5±1.7 ns 50.9±1.5 ns 48.8±1.0 ns

Changes:

0.12

  • clsconfig now become the main decorator for tuning dataobject-based classes.
  • Fix concatenation of mutabletuples (issue #10).

0.11.1:

  • dataobject instances may be deallocated faster now.

0.11:

  • Rename memoryslots to mutabletuple.
  • mutabletuple and immutabletuple dosn't participate in cyclic garbage collection.
  • Add litelist type for list-like objects, which doesn't participate in cyglic garbage collection.

0.10.3:

  • Introduce DataclassStorage and RecordclassStorage. They allow cache classes and used them without creation of new one.
  • Add iterable decorator and argument. Now dataobject with fields isn't iterable by default.
  • Move astuple to dataobject.c.

0.10.2

  • Fix error with dataobject's __copy__.
  • Fix error with pickling of recordclasses and structclasses, which was appeared since 0.8.5 (Thanks to Connor Wolf).

0.10.1

  • Now by default sequence protocol is not supported by default if dataobject has fields, but iteration is supported.
  • By default argsonly=False for usability reasons.

0.10

  • Invent new factory function make_class for creation of different kind of dataobject classes without GC support by default.
  • Invent new metaclass datatype and new base class dataobject for creation dataobject class using class statement. It have disabled GC support, but could be enabled by decorator dataobject.enable_gc. It support type hints (for python >= 3.6) and default values. It may not specify sequence of field names in __fields__ when type hints are applied to all data attributes (for python >= 3.6).
  • Now recordclass-based classes may not support cyclic garbage collection too. This reduces the memory footprint by the size of PyGC_Head. Now by default recordclass-based classes doesn't support cyclic garbage collection.

0.9

  • Change version to 0.9 to indicate a step forward.
  • Cleanup dataobject.__cinit__.

0.8.5

  • Make arrayclass-based objects support setitem/getitem and structclass-based objects able to not support them. By default, as before structclass-based objects support setitem/getitem protocol.
  • Now only instances of dataobject are comparable to 'arrayclass'-based and structclass-based instances.
  • Now generated classes can be hashable.

0.8.4

  • Improve support for readonly mode for structclass and arrayclass.
  • Add tests for arrayclass.

0.8.3

  • Add typehints support to structclass-based classes.

0.8.2

  • Remove usedict, gc, weaklist from the class __dict__.

0.8.1

  • Remove Cython dependence by default for building recordclass from the sources [Issue #7].

0.8

  • Add structclass factory function. It's analog of recordclass but with less memory footprint for it's instances (same as for instances of classes with __slots__) in the camparison with recordclass and namedtuple (it currently implemented with Cython).
  • Add arrayclass factory function which produce a class for creation fixed size array. The benefit of such approach is also less memory footprint (it currently currently implemented with Cython).
  • structclass factory has argument gc now. If gc=False (by default) support of cyclic garbage collection will switched off for instances of the created class.
  • Add function join(C1, C2) in order to join two structclass-based classes C1 and C2.
  • Add sequenceproxy function for creation of immutable and hashable proxy object from class instances, which implement access by index (it currently currently implemented with Cython).
  • Add support for access to recordclass object attributes by idiom: ob['attrname'] (Issue #5).
  • Add argument readonly to recordclass factory to produce immutable namedtuple. In contrast to collection.namedtuple it use same descriptors as for regular recordclasses for performance increasing.

0.7

  • Make mutabletuple objects creation faster. As a side effect: when number of fields >= 8 recordclass instance creation time is not biger than creation time of instaces of dataclasses with __slots__.
  • Recordclass factory function now create new recordclass classes in the same way as namedtuple in 3.7 (there is no compilation of generated python source of class).

0.6

  • Add support for default values in recordclass factory function in correspondence to same addition to namedtuple in python 3.7.

0.5

  • Change version to 0.5

0.4.4

  • Add support for default values in RecordClass (patches from Pedro von Hertwig)
  • Add tests for RecorClass (adopted from python tests for NamedTuple)

0.4.3

  • Add support for typing for python 3.6 (patches from Vladimir Bolshakov).
  • Resolve memory leak issue.

0.4.2

  • Fix memory leak in property getter/setter

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

recordclass-0.12.tar.gz (191.2 kB view details)

Uploaded Source

Built Distributions

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

recordclass-0.12-cp37-cp37m-win_amd64.whl (147.2 kB view details)

Uploaded CPython 3.7mWindows x86-64

recordclass-0.12-cp37-cp37m-win32.whl (130.0 kB view details)

Uploaded CPython 3.7mWindows x86

recordclass-0.12-cp37-cp37m-macosx_10_9_x86_64.whl (151.7 kB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

recordclass-0.12-cp36-cp36m-win_amd64.whl (147.5 kB view details)

Uploaded CPython 3.6mWindows x86-64

recordclass-0.12-cp36-cp36m-win32.whl (130.2 kB view details)

Uploaded CPython 3.6mWindows x86

recordclass-0.12-cp36-cp36m-macosx_10_9_x86_64.whl (154.0 kB view details)

Uploaded CPython 3.6mmacOS 10.9+ x86-64

recordclass-0.12-cp35-cp35m-win_amd64.whl (138.2 kB view details)

Uploaded CPython 3.5mWindows x86-64

recordclass-0.12-cp35-cp35m-win32.whl (120.8 kB view details)

Uploaded CPython 3.5mWindows x86

recordclass-0.12-cp35-cp35m-macosx_10_6_intel.whl (249.9 kB view details)

Uploaded CPython 3.5mmacOS 10.6+ Intel (x86-64, i386)

recordclass-0.12-cp34-cp34m-win_amd64.whl (130.6 kB view details)

Uploaded CPython 3.4mWindows x86-64

recordclass-0.12-cp34-cp34m-win32.whl (117.8 kB view details)

Uploaded CPython 3.4mWindows x86

recordclass-0.12-cp34-cp34m-macosx_10_6_intel.whl (248.3 kB view details)

Uploaded CPython 3.4mmacOS 10.6+ Intel (x86-64, i386)

recordclass-0.12-cp27-cp27m-win_amd64.whl (132.3 kB view details)

Uploaded CPython 2.7mWindows x86-64

recordclass-0.12-cp27-cp27m-win32.whl (117.5 kB view details)

Uploaded CPython 2.7mWindows x86

recordclass-0.12-cp27-cp27m-macosx_10_9_x86_64.whl (143.9 kB view details)

Uploaded CPython 2.7mmacOS 10.9+ x86-64

File details

Details for the file recordclass-0.12.tar.gz.

File metadata

  • Download URL: recordclass-0.12.tar.gz
  • Upload date:
  • Size: 191.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.4.2 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.2

File hashes

Hashes for recordclass-0.12.tar.gz
Algorithm Hash digest
SHA256 6c565f03279861765f1df69bfdfd5e77e156c59b50eabc1b2cb2e9852d66a9b9
MD5 52d2192a43fa85caf3813c0794d6d0f5
BLAKE2b-256 54a2d7265e32fc93ecd506fdf57e1d7fa08243a0c0671e49a37041ca87ad53e0

See more details on using hashes here.

File details

Details for the file recordclass-0.12-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: recordclass-0.12-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 147.2 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.4.2 requests/2.21.0 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.4

File hashes

Hashes for recordclass-0.12-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 fa89441a197a06044dcb0622be013c3c4b24811b1778fa859ed87df31e57c24c
MD5 c4baf5bf5e8e84ec1b9aab761d160a6a
BLAKE2b-256 5643a469545d4dc4e6d9c313a981bb63667230e11371553d2c68b33d58ebae3b

See more details on using hashes here.

File details

Details for the file recordclass-0.12-cp37-cp37m-win32.whl.

File metadata

  • Download URL: recordclass-0.12-cp37-cp37m-win32.whl
  • Upload date:
  • Size: 130.0 kB
  • Tags: CPython 3.7m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.4.2 requests/2.21.0 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.4

File hashes

Hashes for recordclass-0.12-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 8d4da1f27ea9596c7619f30b2575cb72833caf6c5a848a271763027cfef1449a
MD5 83d46166334ffb9933510537d58db7e7
BLAKE2b-256 304717358c58a4ea9046e0cfe85e6537b9b24d76e983597ec0c7155c13190c89

See more details on using hashes here.

File details

Details for the file recordclass-0.12-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: recordclass-0.12-cp37-cp37m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 151.7 kB
  • Tags: CPython 3.7m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.4.2 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.2

File hashes

Hashes for recordclass-0.12-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e0e6ad51d392dc26102daf57b2062d68f5c145a21508aa5f9e6c323f7e383e65
MD5 413de6d98c9d6f754a71788b8e697a24
BLAKE2b-256 1e822235663321c9806ea72f38f2e9cb95dd292568557c755694b231e9cc7d35

See more details on using hashes here.

File details

Details for the file recordclass-0.12-cp36-cp36m-win_amd64.whl.

File metadata

  • Download URL: recordclass-0.12-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 147.5 kB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.4.2 requests/2.21.0 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.4

File hashes

Hashes for recordclass-0.12-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 df9191726612990d67c39a6a0f2bf63f6eca12022fc7c81394c03626a5ee9eb4
MD5 b1ed5f27d9c795d80d4857e861c9d05f
BLAKE2b-256 db58a2600e64ace3f69253534044106f7e368e922c9d87e91af4c405d97e02ed

See more details on using hashes here.

File details

Details for the file recordclass-0.12-cp36-cp36m-win32.whl.

File metadata

  • Download URL: recordclass-0.12-cp36-cp36m-win32.whl
  • Upload date:
  • Size: 130.2 kB
  • Tags: CPython 3.6m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.4.2 requests/2.21.0 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.4

File hashes

Hashes for recordclass-0.12-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 2b4d3c81566e29a66c235b7c922e041e84a8efaeb0c8b245927449de96c98b0c
MD5 0d443a05064fd3dc42c51c3efeeed37a
BLAKE2b-256 9278b28da1bea729453d73af09f4b1a94ac4a8bb1910c39b10214f70d84b0c75

See more details on using hashes here.

File details

Details for the file recordclass-0.12-cp36-cp36m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: recordclass-0.12-cp36-cp36m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 154.0 kB
  • Tags: CPython 3.6m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.4.2 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.2

File hashes

Hashes for recordclass-0.12-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 a9186b41d326c0898757955e59dcfa10a2e10195b992dc99d06547b96eae4dbb
MD5 6b2a7c278a58a3558653bfb1f8d792a1
BLAKE2b-256 1c58ceb994ee7f7c4616b98ededeebe0412088e8ce15ba8971db3a2c5b6f5baa

See more details on using hashes here.

File details

Details for the file recordclass-0.12-cp35-cp35m-win_amd64.whl.

File metadata

  • Download URL: recordclass-0.12-cp35-cp35m-win_amd64.whl
  • Upload date:
  • Size: 138.2 kB
  • Tags: CPython 3.5m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.4.2 requests/2.21.0 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.4

File hashes

Hashes for recordclass-0.12-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 128c4bba5ed5b1e7caba145cd31d0de0826f902d8734d9f6f495f446f3ecc3fe
MD5 56c1fa869f185b337b13299c630f94f3
BLAKE2b-256 82bcb5ac3064c4cb272236e2afe329a02d46837c803cfc18955ff2d302994e45

See more details on using hashes here.

File details

Details for the file recordclass-0.12-cp35-cp35m-win32.whl.

File metadata

  • Download URL: recordclass-0.12-cp35-cp35m-win32.whl
  • Upload date:
  • Size: 120.8 kB
  • Tags: CPython 3.5m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.4.2 requests/2.21.0 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.4

File hashes

Hashes for recordclass-0.12-cp35-cp35m-win32.whl
Algorithm Hash digest
SHA256 93fb923c55da90388aaf7481e23df80f65ed0b456e8665634be424bc3e82272b
MD5 7764a80e14879fbb1a31828c5925f9e1
BLAKE2b-256 3b1910f562ca130241a9b4e59be278698396c7f81950081597a1ce566229dc85

See more details on using hashes here.

File details

Details for the file recordclass-0.12-cp35-cp35m-macosx_10_6_intel.whl.

File metadata

  • Download URL: recordclass-0.12-cp35-cp35m-macosx_10_6_intel.whl
  • Upload date:
  • Size: 249.9 kB
  • Tags: CPython 3.5m, macOS 10.6+ Intel (x86-64, i386)
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.4.2 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.2

File hashes

Hashes for recordclass-0.12-cp35-cp35m-macosx_10_6_intel.whl
Algorithm Hash digest
SHA256 13183f555a75a4d89d2ec467ee11e09b50947d7b6881fa1a2234da603a85cb75
MD5 f347384da5ac68d6a29d1ed9d6f79202
BLAKE2b-256 ce04ec05154d04e60ebabbf633781194cfb2b5f2d3dc8f68da68812c404eee46

See more details on using hashes here.

File details

Details for the file recordclass-0.12-cp34-cp34m-win_amd64.whl.

File metadata

  • Download URL: recordclass-0.12-cp34-cp34m-win_amd64.whl
  • Upload date:
  • Size: 130.6 kB
  • Tags: CPython 3.4m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.4.2 requests/2.21.0 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.4

File hashes

Hashes for recordclass-0.12-cp34-cp34m-win_amd64.whl
Algorithm Hash digest
SHA256 815b926c4b31ffef7b73e61154cee4ea06b3cceba4199ba7f14fd8855bf13d9a
MD5 42b4fc7af5e24486c05f62988f1e9bf1
BLAKE2b-256 05fdc4f19544cda2e6f0d3d26ae58d8232840914070c4e368ae9c70ce3bf7dcc

See more details on using hashes here.

File details

Details for the file recordclass-0.12-cp34-cp34m-win32.whl.

File metadata

  • Download URL: recordclass-0.12-cp34-cp34m-win32.whl
  • Upload date:
  • Size: 117.8 kB
  • Tags: CPython 3.4m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.4.2 requests/2.21.0 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.4

File hashes

Hashes for recordclass-0.12-cp34-cp34m-win32.whl
Algorithm Hash digest
SHA256 9c7643c3e7ce2dd942e1a7838f2eab68f60fe7e8254271706eff70d4a87d715c
MD5 79e3c325b4f237044b2731d40fed7a8e
BLAKE2b-256 9df2a4780d228b12083752995e7931f282b67873b2c3632e026368e6d81d3a3d

See more details on using hashes here.

File details

Details for the file recordclass-0.12-cp34-cp34m-macosx_10_6_intel.whl.

File metadata

  • Download URL: recordclass-0.12-cp34-cp34m-macosx_10_6_intel.whl
  • Upload date:
  • Size: 248.3 kB
  • Tags: CPython 3.4m, macOS 10.6+ Intel (x86-64, i386)
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.4.2 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.2

File hashes

Hashes for recordclass-0.12-cp34-cp34m-macosx_10_6_intel.whl
Algorithm Hash digest
SHA256 a7a976c1af89f3c54b841a2d47228962fe48864e52446265e22f9162d042a019
MD5 e38f78b877fc43926dfc2953573dc159
BLAKE2b-256 92c1e94b3d6731cfca14d8ec83815b5c7e33d9e700f4de0f14d20b6099bdafb2

See more details on using hashes here.

File details

Details for the file recordclass-0.12-cp27-cp27m-win_amd64.whl.

File metadata

  • Download URL: recordclass-0.12-cp27-cp27m-win_amd64.whl
  • Upload date:
  • Size: 132.3 kB
  • Tags: CPython 2.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.4.2 requests/2.21.0 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.4

File hashes

Hashes for recordclass-0.12-cp27-cp27m-win_amd64.whl
Algorithm Hash digest
SHA256 6d6fa2dc74fd84599a0c2755c4bc8a64e1f2bb2aac6fde826d0d61e53152af7d
MD5 fc5b6396d8364f7373edfda082e936b3
BLAKE2b-256 2d452c2e48249c10713b08242e2199818c594fab5e6b3d95c1f4891f9abc78ec

See more details on using hashes here.

File details

Details for the file recordclass-0.12-cp27-cp27m-win32.whl.

File metadata

  • Download URL: recordclass-0.12-cp27-cp27m-win32.whl
  • Upload date:
  • Size: 117.5 kB
  • Tags: CPython 2.7m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.4.2 requests/2.21.0 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.4

File hashes

Hashes for recordclass-0.12-cp27-cp27m-win32.whl
Algorithm Hash digest
SHA256 f00a5f94ae0ae72f41df0f91f1ae40c25eb5ed531d751a5b27d61ed51773236b
MD5 8468226418d8256320de4b2726a18dd2
BLAKE2b-256 4517e1638614e1a9dcf02dc9a65735f4fb914ffb646d9bc777dca773db87aa30

See more details on using hashes here.

File details

Details for the file recordclass-0.12-cp27-cp27m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: recordclass-0.12-cp27-cp27m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 143.9 kB
  • Tags: CPython 2.7m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.4.2 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.8.0 tqdm/4.28.1 CPython/3.7.2

File hashes

Hashes for recordclass-0.12-cp27-cp27m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2332646f514caad62a9bef26888c4547ce18ea28fd498d8204c3fe06f9963b01
MD5 2b31b3f67d4e054ed8a451b6f371756e
BLAKE2b-256 99461cf00a86aad6fdbb7eded723f5623dbf5e6cf4703df1e1abab61c379ae2b

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