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 ofmutabletuplewith 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__) andnamedtuple-like API. It's instances has no__dict__,__weakref__and don't support cyclic garbage collection by default (only reference counting). Butstructclass-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
dataobjectsubclasses 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
clsconfignow become the main decorator for tuning dataobject-based classes.- Fix concatenation of mutabletuples (issue
#10).
0.11.1:
dataobjectinstances may be deallocated faster now.
0.11:
- Rename
memoryslotstomutabletuple. mutabletupleandimmutabletupledosn't participate in cyclic garbage collection.- Add
litelisttype 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
iterabledecorator and argument. Now dataobject with fields isn't iterable by default. - Move
astupletodataobject.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_classfor creation of different kind of dataobject classes without GC support by default. - Invent new metaclass
datatypeand new base classdataobjectfor creation dataobject class usingclassstatement. It have disabled GC support, but could be enabled by decoratordataobject.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 ofPyGC_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 andstructclass-based objects able to not support them. By default, as beforestructclass-based objects support setitem/getitem protocol. - Now only instances of
dataobjectare comparable to 'arrayclass'-based andstructclass-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,weaklistfrom the class__dict__.
0.8.1
- Remove Cython dependence by default for building
recordclassfrom the sources [Issue #7].
0.8
- Add
structclassfactory function. It's analog ofrecordclassbut with less memory footprint for it's instances (same as for instances of classes with__slots__) in the camparison withrecordclassandnamedtuple(it currently implemented withCython). - Add
arrayclassfactory function which produce a class for creation fixed size array. The benefit of such approach is also less memory footprint (it currently currently implemented withCython). structclassfactory has argumentgcnow. Ifgc=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 twostructclass-based classes C1 and C2. - Add
sequenceproxyfunction for creation of immutable and hashable proxy object from class instances, which implement access by index (it currently currently implemented withCython). - Add support for access to recordclass object attributes by idiom:
ob['attrname'](Issue #5). - Add argument
readonlyto recordclass factory to produce immutable namedtuple. In contrast tocollection.namedtupleit 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6c565f03279861765f1df69bfdfd5e77e156c59b50eabc1b2cb2e9852d66a9b9
|
|
| MD5 |
52d2192a43fa85caf3813c0794d6d0f5
|
|
| BLAKE2b-256 |
54a2d7265e32fc93ecd506fdf57e1d7fa08243a0c0671e49a37041ca87ad53e0
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fa89441a197a06044dcb0622be013c3c4b24811b1778fa859ed87df31e57c24c
|
|
| MD5 |
c4baf5bf5e8e84ec1b9aab761d160a6a
|
|
| BLAKE2b-256 |
5643a469545d4dc4e6d9c313a981bb63667230e11371553d2c68b33d58ebae3b
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8d4da1f27ea9596c7619f30b2575cb72833caf6c5a848a271763027cfef1449a
|
|
| MD5 |
83d46166334ffb9933510537d58db7e7
|
|
| BLAKE2b-256 |
304717358c58a4ea9046e0cfe85e6537b9b24d76e983597ec0c7155c13190c89
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e0e6ad51d392dc26102daf57b2062d68f5c145a21508aa5f9e6c323f7e383e65
|
|
| MD5 |
413de6d98c9d6f754a71788b8e697a24
|
|
| BLAKE2b-256 |
1e822235663321c9806ea72f38f2e9cb95dd292568557c755694b231e9cc7d35
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
df9191726612990d67c39a6a0f2bf63f6eca12022fc7c81394c03626a5ee9eb4
|
|
| MD5 |
b1ed5f27d9c795d80d4857e861c9d05f
|
|
| BLAKE2b-256 |
db58a2600e64ace3f69253534044106f7e368e922c9d87e91af4c405d97e02ed
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2b4d3c81566e29a66c235b7c922e041e84a8efaeb0c8b245927449de96c98b0c
|
|
| MD5 |
0d443a05064fd3dc42c51c3efeeed37a
|
|
| BLAKE2b-256 |
9278b28da1bea729453d73af09f4b1a94ac4a8bb1910c39b10214f70d84b0c75
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a9186b41d326c0898757955e59dcfa10a2e10195b992dc99d06547b96eae4dbb
|
|
| MD5 |
6b2a7c278a58a3558653bfb1f8d792a1
|
|
| BLAKE2b-256 |
1c58ceb994ee7f7c4616b98ededeebe0412088e8ce15ba8971db3a2c5b6f5baa
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
128c4bba5ed5b1e7caba145cd31d0de0826f902d8734d9f6f495f446f3ecc3fe
|
|
| MD5 |
56c1fa869f185b337b13299c630f94f3
|
|
| BLAKE2b-256 |
82bcb5ac3064c4cb272236e2afe329a02d46837c803cfc18955ff2d302994e45
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
93fb923c55da90388aaf7481e23df80f65ed0b456e8665634be424bc3e82272b
|
|
| MD5 |
7764a80e14879fbb1a31828c5925f9e1
|
|
| BLAKE2b-256 |
3b1910f562ca130241a9b4e59be278698396c7f81950081597a1ce566229dc85
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
13183f555a75a4d89d2ec467ee11e09b50947d7b6881fa1a2234da603a85cb75
|
|
| MD5 |
f347384da5ac68d6a29d1ed9d6f79202
|
|
| BLAKE2b-256 |
ce04ec05154d04e60ebabbf633781194cfb2b5f2d3dc8f68da68812c404eee46
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
815b926c4b31ffef7b73e61154cee4ea06b3cceba4199ba7f14fd8855bf13d9a
|
|
| MD5 |
42b4fc7af5e24486c05f62988f1e9bf1
|
|
| BLAKE2b-256 |
05fdc4f19544cda2e6f0d3d26ae58d8232840914070c4e368ae9c70ce3bf7dcc
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9c7643c3e7ce2dd942e1a7838f2eab68f60fe7e8254271706eff70d4a87d715c
|
|
| MD5 |
79e3c325b4f237044b2731d40fed7a8e
|
|
| BLAKE2b-256 |
9df2a4780d228b12083752995e7931f282b67873b2c3632e026368e6d81d3a3d
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a7a976c1af89f3c54b841a2d47228962fe48864e52446265e22f9162d042a019
|
|
| MD5 |
e38f78b877fc43926dfc2953573dc159
|
|
| BLAKE2b-256 |
92c1e94b3d6731cfca14d8ec83815b5c7e33d9e700f4de0f14d20b6099bdafb2
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6d6fa2dc74fd84599a0c2755c4bc8a64e1f2bb2aac6fde826d0d61e53152af7d
|
|
| MD5 |
fc5b6396d8364f7373edfda082e936b3
|
|
| BLAKE2b-256 |
2d452c2e48249c10713b08242e2199818c594fab5e6b3d95c1f4891f9abc78ec
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f00a5f94ae0ae72f41df0f91f1ae40c25eb5ed531d751a5b27d61ed51773236b
|
|
| MD5 |
8468226418d8256320de4b2726a18dd2
|
|
| BLAKE2b-256 |
4517e1638614e1a9dcf02dc9a65735f4fb914ffb646d9bc777dca773db87aa30
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2332646f514caad62a9bef26888c4547ce18ea28fd498d8204c3fe06f9963b01
|
|
| MD5 |
2b31b3f67d4e054ed8a451b6f371756e
|
|
| BLAKE2b-256 |
99461cf00a86aad6fdbb7eded723f5623dbf5e6cf4703df1e1abab61c379ae2b
|