Skip to main content

Environmental Acquisiton

This package implements “environmental acquisiton” for Python, as proposed in the OOPSLA96 paper by Joseph Gil and David H. Lorenz:

We propose a new programming paradigm, environmental acquisition in the context of object aggregation, in which objects acquire behaviour from their current containers at runtime. The key idea is that the behaviour of a component may depend upon its enclosing composite(s). In particular, we propose a form of feature sharing in which an object “inherits” features from the classes of objects in its environment. By examining the declaration of classes, it is possible to determine which kinds of classes may contain a component, and which components must be contained in a given kind of composite. These relationships are the basis for language constructs that supports acquisition.

Introductory Example

Zope implements acquisition with “Extension Class” mix-in classes. To use acquisition your classes must inherit from an acquisition base class. For example:

>>> import ExtensionClass, Acquisition

>>> class C(ExtensionClass.Base):
...     color = 'red'

>>> class A(Acquisition.Implicit):
...     def report(self):
...         print(self.color)
...
>>> a = A()
>>> c = C()
>>> c.a = a

>>> c.a.report()
red

>>> d = C()
>>> d.color = 'green'
>>> d.a = a

>>> d.a.report()
green

>>> try:
...     a.report()
... except AttributeError:
...     pass
... else:
...     raise AssertionError('AttributeError not raised.')

The class A inherits acquisition behavior from Acquisition.Implicit. The object, a, “has” the color of objects c and d when it is accessed through them, but it has no color by itself. The object a obtains attributes from its environment, where its environment is defined by the access path used to reach a.

Acquisition Wrappers

When an object that supports acquisition is accessed through an extension class instance, a special object, called an acquisition wrapper, is returned. In the example above, the expression c.a returns an acquisition wrapper that contains references to both c and a. It is this wrapper that performs attribute lookup in c when an attribute cannot be found in a.

Acquisition wrappers provide access to the wrapped objects through the attributes aq_parent, aq_self, aq_base. Continue the example from above:

>>> c.a.aq_parent is c
True
>>> c.a.aq_self is a
True

Explicit and Implicit Acquisition

Two styles of acquisition are supported: implicit and explicit acquisition.

Implicit acquisition

Implicit acquisition is so named because it searches for attributes from the environment automatically whenever an attribute cannot be obtained directly from an object or through inheritance.

An attribute can be implicitly acquired if its name does not begin with an underscore.

To support implicit acquisition, your class should inherit from the mix-in class Acquisition.Implicit.

Explicit Acquisition

When explicit acquisition is used, attributes are not automatically obtained from the environment. Instead, the method aq_acquire must be used. For example:

>>> print(c.a.aq_acquire('color'))
red

To support explicit acquisition, your class should inherit from the mix-in class Acquisition.Explicit.

Controlling Acquisition

A class (or instance) can provide attribute by attribute control over acquisition. You should subclass from Acquisition.Explicit, and set all attributes that should be acquired to the special value Acquisition.Acquired. Setting an attribute to this value also allows inherited attributes to be overridden with acquired ones. For example:

>>> class C(Acquisition.Explicit):
...     id = 1
...     secret = 2
...     color = Acquisition.Acquired
...     __roles__ = Acquisition.Acquired

The only attributes that are automatically acquired from containing objects are color, and __roles__. Note that the __roles__ attribute is acquired even though its name begins with an underscore. In fact, the special Acquisition.Acquired value can be used in Acquisition.Implicit objects to implicitly acquire selected objects that smell like private objects.

Sometimes, you want to dynamically make an implicitly acquiring object acquire explicitly. You can do this by getting the object’s aq_explicit attribute. This attribute provides the object with an explicit wrapper that replaces the original implicit wrapper.

Filtered Acquisition

The acquisition method, aq_acquire, accepts two optional arguments. The first of the additional arguments is a “filtering” function that is used when considering whether to acquire an object. The second of the additional arguments is an object that is passed as extra data when calling the filtering function and which defaults to None. The filter function is called with five arguments:

  • The object that the aq_acquire method was called on,

  • The object where an object was found,

  • The name of the object, as passed to aq_acquire,

  • The object found, and

  • The extra data passed to aq_acquire.

If the filter returns a true object that the object found is returned, otherwise, the acquisition search continues.

Here’s an example:

>>> from Acquisition import Explicit

>>> class HandyForTesting(object):
...     def __init__(self, name):
...         self.name = name
...     def __str__(self):
...         return "%s(%s)" % (self.name, self.__class__.__name__)
...     __repr__=__str__
...
>>> class E(Explicit, HandyForTesting): pass
...
>>> class Nice(HandyForTesting):
...     isNice = 1
...     def __str__(self):
...         return HandyForTesting.__str__(self)+' and I am nice!'
...     __repr__ = __str__
...
>>> a = E('a')
>>> a.b = E('b')
>>> a.b.c = E('c')
>>> a.p = Nice('spam')
>>> a.b.p = E('p')

>>> def find_nice(self, ancestor, name, object, extra):
...     return hasattr(object,'isNice') and object.isNice

>>> print(a.b.c.aq_acquire('p', find_nice))
spam(Nice) and I am nice!

The filtered acquisition in the last line skips over the first attribute it finds with the name p, because the attribute doesn’t satisfy the condition given in the filter.

Filtered acquisition is rarely used in Zope.

Acquiring from Context

Normally acquisition allows objects to acquire data from their containers. However an object can acquire from objects that aren’t its containers.

Most of the examples we’ve seen so far show establishing of an acquisition context using getattr semantics. For example, a.b is a reference to b in the context of a.

You can also manually set acquisition context using the __of__ method. For example:

>>> from Acquisition import Implicit
>>> class C(Implicit): pass
...
>>> a = C()
>>> b = C()
>>> a.color = "red"
>>> print(b.__of__(a).color)
red

In this case, a does not contain b, but it is put in b’s context using the __of__ method.

Here’s another subtler example that shows how you can construct an acquisition context that includes non-container objects:

>>> from Acquisition import Implicit

>>> class C(Implicit):
...     def __init__(self, name):
...         self.name = name

>>> a = C("a")
>>> a.b = C("b")
>>> a.b.color = "red"
>>> a.x = C("x")

>>> print(a.b.x.color)
red

Even though b does not contain x, x can acquire the color attribute from b. This works because in this case, x is accessed in the context of b even though it is not contained by b.

Here acquisition context is defined by the objects used to access another object.

Containment Before Context

If in the example above suppose both a and b have an color attribute:

>>> a = C("a")
>>> a.color = "green"
>>> a.b = C("b")
>>> a.b.color = "red"
>>> a.x = C("x")

>>> print(a.b.x.color)
green

Why does a.b.x.color acquire color from a and not from b? The answer is that an object acquires from its containers before non-containers in its context.

To see why consider this example in terms of expressions using the __of__ method:

a.x -> x.__of__(a)

a.b -> b.__of__(a)

a.b.x -> x.__of__(a).__of__(b.__of__(a))

Keep in mind that attribute lookup in a wrapper is done by trying to look up the attribute in the wrapped object first and then in the parent object. So in the expressions above proceeds from left to right.

The upshot of these rules is that attributes are looked up by containment before context.

This rule holds true also for more complex examples. For example, a.b.c.d.e.f.g.attribute would search for attribute in g and all its containers first. (Containers are searched in order from the innermost parent to the outermost container.) If the attribute is not found in g or any of its containers, then the search moves to f and all its containers, and so on.

Additional Attributes and Methods

You can use the special method aq_inner to access an object wrapped only by containment. So in the example above, a.b.x.aq_inner is equivalent to a.x.

You can find out the acquisition context of an object using the aq_chain method like so:

>>> [obj.name for obj in a.b.x.aq_chain]
['x', 'b', 'a']

You can find out if an object is in the containment context of another object using the aq_inContextOf method. For example:

>>> a.b.aq_inContextOf(a)
True

Acquisition Module Functions

In addition to using acquisition attributes and methods directly on objects you can use similar functions defined in the Acquisition module. These functions have the advantage that you don’t need to check to make sure that the object has the method or attribute before calling it.

aq_acquire(object, name [, filter, extra, explicit, default, containment])

Acquires an object with the given name.

This function can be used to explictly acquire when using explicit acquisition and to acquire names that wouldn’t normally be acquired.

The function accepts a number of optional arguments:

filter

A callable filter object that is used to decide if an object should be acquired.

The filter is called with five arguments:

  • The object that the aq_acquire method was called on,

  • The object where an object was found,

  • The name of the object, as passed to aq_acquire,

  • The object found, and

  • The extra argument passed to aq_acquire.

If the filter returns a true object that the object found is returned, otherwise, the acquisition search continues.

extra

Extra data to be passed as the last argument to the filter.

explicit

A flag (boolean value) indicating whether explicit acquisition should be used. The default value is true. If the flag is true, then acquisition will proceed regardless of whether wrappers encountered in the search of the acquisition hierarchy are explicit or implicit wrappers. If the flag is false, then parents of explicit wrappers are not searched.

This argument is useful if you want to apply a filter without overriding explicit wrappers.

default

A default value to return if no value can be acquired.

containment

A flag indicating whether the search should be limited to the containment hierarchy.

In addition, arguments can be provided as keywords.

aq_base(object)

Return the object with all wrapping removed.

aq_chain(object [, containment])

Return a list containing the object and it’s acquisition parents. The optional argument, containment, controls whether the containment or access hierarchy is used.

aq_get(object, name [, default, containment])

Acquire an attribute, name. A default value can be provided, as can a flag that limits search to the containment hierarchy.

aq_inner(object)

Return the object with all but the innermost layer of wrapping removed.

aq_parent(object)

Return the acquisition parent of the object or None if the object is unwrapped.

aq_self(object)

Return the object with one layer of wrapping removed, unless the object is unwrapped, in which case the object is returned.

In most cases it is more convenient to use these module functions instead of the acquisition attributes and methods directly.

Acquisition and Methods

Python methods of objects that support acquisition can use acquired attributes. When a Python method is called on an object that is wrapped by an acquisition wrapper, the wrapper is passed to the method as the first argument. This rule also applies to user-defined method types and to C methods defined in pure mix-in classes.

Unfortunately, C methods defined in extension base classes that define their own data structures, cannot use aquired attributes at this time. This is because wrapper objects do not conform to the data structures expected by these methods. In practice, you will seldom find this a problem.

Conclusion

Acquisition provides a powerful way to dynamically share information between objects. Zope uses acquisition for a number of its key features including security, object publishing, and DTML variable lookup. Acquisition also provides an elegant solution to the problem of circular references for many classes of problems. While acquisition is powerful, you should take care when using acquisition in your applications. The details can get complex, especially with the differences between acquiring from context and acquiring from containment.

Changelog

4.9 (2021-08-19)

  • On CPython no longer omit compiling the C code when PURE_PYTHON is required. Just evaluate it at runtime. (#53)

4.8 (2021-07-20)

  • Various fixes for the PURE_PYTHON version, e.g. make Acquired an str (as required by Zope), avoid infinite __cmp__ loop. (#51, #48)

  • Create aarch64 wheels.

4.7 (2020-10-07)

  • Add support for Python 3.8 and 3.9.

4.6 (2019-04-24)

  • Drop support for Python 3.4.

  • Add support for Python 3.8a3.

  • Add support to call bytes() on an object wrapped by an ImplicitAcquisitionWrapper. (#38)

4.5 (2018-10-05)

  • Avoid deprecation warnings by using current API.

  • Add support for Python 3.7.

4.4.4 (2017-11-24)

  • Add Appveyor configuration to automate building Windows eggs.

4.4.3 (2017-11-23)

  • Fix the extremely rare potential for a crash when the C extensions are in use. See issue 21.

4.4.2 (2017-05-12)

  • Fix C capsule name to fix import errors.

  • Ensure our dependencies match our expactations about C extensions.

4.4.1 (2017-05-04)

  • Fix C code under Python 3.4, with missing Py_XSETREF.

4.4.0 (2017-05-04)

  • Enable the C extension under Python 3.

  • Drop support for Python 3.3.

4.3.0 (2017-01-20)

  • Make tests compatible with ExtensionClass 4.2.0.

  • Drop support for Python 2.6 and 3.2.

  • Add support for Python 3.5 and 3.6.

4.2.2 (2015-05-19)

4.2.1 (2015-04-23)

4.2 (2015-04-04)

  • Add support for PyPy, PyPy3, and Python 3.2, 3.3, and 3.4.

4.1 (2014-12-18)

  • Bump dependency on ExtensionClass to match current release.

4.0.3 (2014-11-02)

  • Skip readme.rst tests when tests are run outside a source checkout.

4.0.2 (2014-11-02)

  • Include *.rst files in the release.

4.0.1 (2014-10-30)

  • Tolerate Unicode attribute names (ASCII only). LP #143358.

  • Make module-level aq_acquire API respect the default parameter. LP #1387363.

  • Don’t raise an attribute error for __iter__ if the fallback to __getitem__ succeeds. LP #1155760.

4.0 (2013-02-24)

  • Added trove classifiers to project metadata.

4.0a1 (2011-12-13)

  • Raise RuntimeError: Recursion detected in acquisition wrapper if an object with a __parent__ pointer points to a wrapper that in turn points to the original object.

  • Prevent wrappers to be created while accessing __parent__ on types derived from Explicit or Implicit base classes.

2.13.9 (2015-02-17)

  • Tolerate Unicode attribute names (ASCII only). LP #143358.

  • Make module-level aq_acquire API respect the default parameter. LP #1387363.

  • Don’t raise an attribute error for __iter__ if the fallback to __getitem__ succeeds. LP #1155760.

2.13.8 (2011-06-11)

  • Fixed a segfault on 64bit platforms when providing the explicit argument to the aq_acquire method of an Acquisition wrapper. Thx to LP #675064 for the hint to the solution. The code passed an int instead of a pointer into a function.

2.13.7 (2011-03-02)

  • Fixed bug: When an object did not implement __unicode__, calling unicode(wrapped) was calling __str__ with an unwrapped self.

2.13.6 (2011-02-19)

  • Add aq_explicit to IAcquisitionWrapper.

  • Fixed bug: unicode(wrapped) was not calling a __unicode__ method on wrapped objects.

2.13.5 (2010-09-29)

  • Fixed unit tests that failed on 64bit Python on Windows machines.

2.13.4 (2010-08-31)

  • LP 623665: Fixed typo in Acquisition.h.

2.13.3 (2010-04-19)

  • Use the doctest module from the standard library and no longer depend on zope.testing.

2.13.2 (2010-04-04)

  • Give both wrapper classes a __getnewargs__ method, which causes the ZODB optimization to fail and create persistent references using the _p_oid alone. This happens to be the persistent oid of the wrapped object. This lets these objects to be persisted correctly, even though they are passed to the ZODB in a wrapped state.

  • Added failing tests for http://dev.plone.org/plone/ticket/10318. This shows an edge-case where AQ wrappers can be pickled using the specific combination of cPickle, pickle protocol one and a custom Pickler class with an inst_persistent_id hook. Unfortunately this is the exact combination used by ZODB3.

2.13.1 (2010-02-23)

  • Update to include ExtensionClass 2.13.0.

  • Fix the tp_name of the ImplicitAcquisitionWrapper and ExplicitAcquisitionWrapper to match their Python visible names and thus have a correct __name__.

  • Expand the tp_name of our extension types to hold the fully qualified name. This ensures classes have their __module__ set correctly.

2.13.0 (2010-02-14)

2.12.4 (2009-10-29)

  • Fix iteration proxying to pass self acquisition-wrapped into both __iter__ as well as __getitem__ (this fixes https://bugs.launchpad.net/zope2/+bug/360761).

  • Add tests for the __getslice__ proxying, including open-ended slicing.

2.12.3 (2009-08-08)

  • More 64-bit fixes in Py_BuildValue calls.

  • More 64-bit issues fixed: Use correct integer size for slice operations.

2.12.2 (2009-08-02)

2.12.1 (2009-04-15)

  • Update for iteration proxying: The proxy for __iter__ must not rely on the object to have an __iter__ itself, but also support fall-back iteration via __getitem__ (this fixes https://bugs.launchpad.net/zope2/+bug/360761).

2.12 (2009-01-25)

  • Release as separate package.

Download files

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

Source Distribution

Acquisition-4.9.tar.gz (64.4 kB view details)

Uploaded Source

Built Distributions

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

Acquisition-4.9-cp39-cp39-win_amd64.whl (65.2 kB view details)

Uploaded CPython 3.9Windows x86-64

Acquisition-4.9-cp39-cp39-win32.whl (63.0 kB view details)

Uploaded CPython 3.9Windows x86

Acquisition-4.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (117.4 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

Acquisition-4.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (120.4 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.12+ x86-64manylinux: glibc 2.5+ x86-64

Acquisition-4.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (113.9 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.12+ i686manylinux: glibc 2.5+ i686

Acquisition-4.9-cp39-cp39-macosx_10_14_x86_64.whl (65.1 kB view details)

Uploaded CPython 3.9macOS 10.14+ x86-64

Acquisition-4.9-cp38-cp38-win_amd64.whl (65.3 kB view details)

Uploaded CPython 3.8Windows x86-64

Acquisition-4.9-cp38-cp38-win32.whl (63.1 kB view details)

Uploaded CPython 3.8Windows x86

Acquisition-4.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (118.4 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARM64

Acquisition-4.9-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (121.9 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.12+ x86-64manylinux: glibc 2.5+ x86-64

Acquisition-4.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (115.2 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.12+ i686manylinux: glibc 2.5+ i686

Acquisition-4.9-cp38-cp38-macosx_10_14_x86_64.whl (65.1 kB view details)

Uploaded CPython 3.8macOS 10.14+ x86-64

Acquisition-4.9-cp37-cp37m-win_amd64.whl (65.1 kB view details)

Uploaded CPython 3.7mWindows x86-64

Acquisition-4.9-cp37-cp37m-win32.whl (62.8 kB view details)

Uploaded CPython 3.7mWindows x86

Acquisition-4.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (109.1 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ ARM64

Acquisition-4.9-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (112.1 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.12+ x86-64manylinux: glibc 2.5+ x86-64

Acquisition-4.9-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (105.4 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.12+ i686manylinux: glibc 2.5+ i686

Acquisition-4.9-cp37-cp37m-macosx_10_14_x86_64.whl (65.0 kB view details)

Uploaded CPython 3.7mmacOS 10.14+ x86-64

Acquisition-4.9-cp36-cp36m-win_amd64.whl (65.1 kB view details)

Uploaded CPython 3.6mWindows x86-64

Acquisition-4.9-cp36-cp36m-win32.whl (62.8 kB view details)

Uploaded CPython 3.6mWindows x86

Acquisition-4.9-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (109.1 kB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.17+ ARM64

Acquisition-4.9-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (111.2 kB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.12+ x86-64manylinux: glibc 2.5+ x86-64

Acquisition-4.9-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (104.5 kB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.12+ i686manylinux: glibc 2.5+ i686

Acquisition-4.9-cp36-cp36m-macosx_10_14_x86_64.whl (65.0 kB view details)

Uploaded CPython 3.6mmacOS 10.14+ x86-64

Acquisition-4.9-cp35-cp35m-win_amd64.whl (65.1 kB view details)

Uploaded CPython 3.5mWindows x86-64

Acquisition-4.9-cp35-cp35m-win32.whl (62.8 kB view details)

Uploaded CPython 3.5mWindows x86

Acquisition-4.9-cp27-cp27m-win_amd64.whl (63.1 kB view details)

Uploaded CPython 2.7mWindows x86-64

Acquisition-4.9-cp27-cp27m-win32.whl (61.6 kB view details)

Uploaded CPython 2.7mWindows x86

Acquisition-4.9-cp27-cp27m-macosx_10_14_x86_64.whl (65.1 kB view details)

Uploaded CPython 2.7mmacOS 10.14+ x86-64

File details

Details for the file Acquisition-4.9.tar.gz.

File metadata

  • Download URL: Acquisition-4.9.tar.gz
  • Upload date:
  • Size: 64.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/None requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.7.11

File hashes

Hashes for Acquisition-4.9.tar.gz
Algorithm Hash digest
SHA256 3068d21f8a0d123e67f97dc9c1671d4a63189510b7a31e4c3cabddc76175bbc5
MD5 d14a157046416487ae3a8e871d561437
BLAKE2b-256 989dc407f510e3ec022c7c7d49b3b957a05355ba8df18eeb89b1911c396b054a

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: Acquisition-4.9-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 65.2 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.4 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/3.9.0

File hashes

Hashes for Acquisition-4.9-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 a0c684d2cc7f41a7cd5b891addafb6c08408315cc2dc6bc472949c43cae833a4
MD5 53d7775d67a398e1fa32b298505013ec
BLAKE2b-256 bfe4b86d89b73760a890d6dc6a40f9e853931a698ba265b23c400b6ce5821587

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp39-cp39-win32.whl.

File metadata

  • Download URL: Acquisition-4.9-cp39-cp39-win32.whl
  • Upload date:
  • Size: 63.0 kB
  • Tags: CPython 3.9, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.4 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/3.9.0

File hashes

Hashes for Acquisition-4.9-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 168587cba6981b85a97299a222c94532da803f50e1f0541121638bc5976385ad
MD5 2c22bfc9e9eb6e8bcbdf34d720fead15
BLAKE2b-256 1ff1c5b01f63d36d30a40ec8f1c80ce7669cf52d773655f5402011bc8301a681

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for Acquisition-4.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 be3c262681c25347e5a707e52c242e444800220bc7446bdb3c1385f1c615b7f4
MD5 2ab48d6bf686c3aa0a330760bf0b5d56
BLAKE2b-256 25e64bf8a1e8aab924728af91289e11eca0945123fce9ef1f8b67c98da93fea0

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-4.9-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 e768257c913231cb0c4ddbafdc90b77d1007815a8eeb9709c8d333446d6371c6
MD5 a29daa9e0c1d44abe3060b512e42c5ff
BLAKE2b-256 64fed0f294b34b675370c345ede47719a7b72c3faacfc568294a8dbb3782b1f3

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for Acquisition-4.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 ed4f72e5e60fcad2bb4f7bf8f52f5eb47cf28ec0be6f6f6bf369515b57719bf4
MD5 f8d8c338bd7ff9215ee71100672e767e
BLAKE2b-256 643e4bddacc8fc9c6ddd3311a725fea9df9553272ca717515799b7136398f46b

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp39-cp39-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: Acquisition-4.9-cp39-cp39-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 65.1 kB
  • Tags: CPython 3.9, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.4 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/3.9.6

File hashes

Hashes for Acquisition-4.9-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 d3b61ecb3aeac5d001241892ae1df39a6ed6d5a1066601605555a32c1aef6328
MD5 80cf4a07bd936f4e6121aeb80269bfae
BLAKE2b-256 34e97ce44142dfdb8059d4ec064108abedb0627c1c876902263b9dfb54262a05

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: Acquisition-4.9-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 65.3 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.4 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/3.8.0

File hashes

Hashes for Acquisition-4.9-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 408d949a93e4792d42878255039ae4593aad2ebebbbf09ac4c278d0e220ea21b
MD5 01004a947223c9aaeb6b0ff7912306fb
BLAKE2b-256 32de9edd8939edd40f157ab1229f145209b2875297d57709bc2f1b9c546e6c1a

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp38-cp38-win32.whl.

File metadata

  • Download URL: Acquisition-4.9-cp38-cp38-win32.whl
  • Upload date:
  • Size: 63.1 kB
  • Tags: CPython 3.8, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.4 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/3.8.0

File hashes

Hashes for Acquisition-4.9-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 6475f74821eb113830bcf806bd4985af1ba5fc184bab9e5d8aa2e263727f968a
MD5 5acd30055f1d8249452ac524643361a1
BLAKE2b-256 0d2e2de3918af5fb83b8e86cdc01507c3d5e4fb0013d145b03f7dc115aa16367

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for Acquisition-4.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 7a15f21c37a8433615a1ea7f75a3dd00c2ae476cac6e0a24d0b64929860dcd5f
MD5 fe6a98435881c29bf92b6ffe0ee94442
BLAKE2b-256 99e300c4c61461a53d93be4fd7047a63528e9590062235780bd2156fc92878a9

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-4.9-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 ad669c29d6a19df9a3de0bd8bec7310c9e2f07a3af3b49c0a0abd6b67dcfce1e
MD5 972ddc51eaa8112f20614ed0abac1534
BLAKE2b-256 64816f15bb7c8710d603594f3b4082376a936ee15babf28bfdcbbf3dcef0e17e

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for Acquisition-4.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 ba7e41955c6a529c3901739d85b058848205db3b4a6da1c33b760586bce030f2
MD5 b9a191fd7b592d2e2fed62773fc2a13e
BLAKE2b-256 16c8f78c02da430eeae4afb8b8ec4f36d693dbb574d9f87ff52d9a9ebfc99c13

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp38-cp38-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: Acquisition-4.9-cp38-cp38-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 65.1 kB
  • Tags: CPython 3.8, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.4 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/3.8.11

File hashes

Hashes for Acquisition-4.9-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 e67f43c0553c00b7785d3a1ff2ad75fa0374fc0fb32bad7a6e7a8b50e5a3cc56
MD5 16df170d5be2498f4ae39d7825be82f5
BLAKE2b-256 9735def20caf47b7103a5c8097f219a6373d8e21e38b6f3b5f7a50b23a722238

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: Acquisition-4.9-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 65.1 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.4 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/3.7.5

File hashes

Hashes for Acquisition-4.9-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 ae65e555a7c08afab57f8e7f8a90379fd74c462042f943ddd7fc6194dd65d18f
MD5 f7ed3ea16a30d102e932f9d6169d9ceb
BLAKE2b-256 06e5284f867ba84d69fc44b3c59e115f171345109122708d17d8379d9a05c54d

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp37-cp37m-win32.whl.

File metadata

  • Download URL: Acquisition-4.9-cp37-cp37m-win32.whl
  • Upload date:
  • Size: 62.8 kB
  • Tags: CPython 3.7m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.4 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/3.7.5

File hashes

Hashes for Acquisition-4.9-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 dae0ab19dbddbfc1cbff3855781b019195c1b80f8d6c05c363382fd47edb0123
MD5 2b14fff99f26473f62789409c156a59b
BLAKE2b-256 65cc6a95df2c486e5e45b8d219ff694c247e5d3b4136f314ddbc9600e5f21132

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for Acquisition-4.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f1e90ca461e11a679bfefe6c5f9be0a53bfdc11dbd9158b71d9be1b64c7c0da6
MD5 51bd42a345cc7de4d7ac02017865f394
BLAKE2b-256 917f23cd21c0c7cbf947c843cfecbe23fe892be4a433a36af3db2732f44f91fe

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-4.9-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 ab179d35ca9ab7f2cae73342d28301617c3d7da6f774e94d55bd8d6bf88f15c8
MD5 54d90d3b7c39d357340d7b94c0fa7ec3
BLAKE2b-256 3a261a6326dc87633ffb6abcb787fae35bd09c43836aa2962eaade909aff5c23

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for Acquisition-4.9-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 8e1e6c8528df16b3c60e2af1ef2b699e8712882a3f0e9b18d35c32450f58261f
MD5 428bb0e2509ec0ff7ede7cc032859ddf
BLAKE2b-256 2f08119958ddcb3208c11cd0ab80e37d86f7e583dcce24d1c39e2599b0fe43d7

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp37-cp37m-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: Acquisition-4.9-cp37-cp37m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 65.0 kB
  • Tags: CPython 3.7m, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.4 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/3.7.11

File hashes

Hashes for Acquisition-4.9-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 d33ca614f66836e096b81f264927b32a8b2b819982959fbed38a35d0f73ce130
MD5 22ce289dc5519e95fb8ac26d98c35b3b
BLAKE2b-256 b3d89e7a6236bb1f98223f50f2d916b3e2024689274f525051755b684bc0b288

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp36-cp36m-win_amd64.whl.

File metadata

  • Download URL: Acquisition-4.9-cp36-cp36m-win_amd64.whl
  • Upload date:
  • Size: 65.1 kB
  • Tags: CPython 3.6m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.4 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/3.6.8

File hashes

Hashes for Acquisition-4.9-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 80f66a56f4f541be3335e9bd3b5fa1b5b4c2bb93775c6bad497c72ca5746ea3d
MD5 ac27643ed0db9840a790b5dd678028a8
BLAKE2b-256 40018c3b1d8fcc2e03cf9e42f88f0faec1cb1b04fcbf4dc50fc6778e66f0eb10

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp36-cp36m-win32.whl.

File metadata

  • Download URL: Acquisition-4.9-cp36-cp36m-win32.whl
  • Upload date:
  • Size: 62.8 kB
  • Tags: CPython 3.6m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.4 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/3.6.8

File hashes

Hashes for Acquisition-4.9-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 cd7391a68973f6df383a0e756cf61ee3fb9767375d32810a7884a05b574c34c1
MD5 8fbb1142a7b4d16cd08cc3030e557e70
BLAKE2b-256 a29e5131253efab798a5f5ae15b582c407ed93f353305ed8e7bc796567fa2fb4

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for Acquisition-4.9-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1ab88df4e6e036ae9cdd65d7f07f524e6c026b52e79dbc4001d83f26d866d163
MD5 acd0d0f974d0993814f2a510878f3ad3
BLAKE2b-256 961348e22f7eec7d2834734195dfa880f9469878a48e91bb72d72ea2ae92b662

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-4.9-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 fae256544e178ca5c13f923fc68fba4f4683f16a660e39e3031eca8ca56f5204
MD5 c56236c77bd05bb4662e6a9bb338b6bc
BLAKE2b-256 7eab95cf707907251b2646547ae9327cc491709fbad2ddaec61d2ac8fd42d7b9

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for Acquisition-4.9-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 5962418ae5db4c120adfc7a0187ebcc02f65f87857d7618b9110ed7d979b2226
MD5 9e96d11fbfdd01c4f35c5219de97d658
BLAKE2b-256 ad7895d54e3f16aa55232836e60e678db3bfe579b2cb9223a9c09b66394f5069

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp36-cp36m-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: Acquisition-4.9-cp36-cp36m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 65.0 kB
  • Tags: CPython 3.6m, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.2 importlib_metadata/4.6.4 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/3.6.14

File hashes

Hashes for Acquisition-4.9-cp36-cp36m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 52dd2228f71660cf2c76c2f4f02121060caf9b2fe1819c178b8c2c1dd100f03b
MD5 8c90383a7faec2e8ef1ae16e5d907a66
BLAKE2b-256 8c4844f231569fb5ab2c5895a5c715003203c105910285062d889fcefbbdfa49

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp35-cp35m-win_amd64.whl.

File metadata

  • Download URL: Acquisition-4.9-cp35-cp35m-win_amd64.whl
  • Upload date:
  • Size: 65.1 kB
  • Tags: CPython 3.5m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.7.1 requests/2.25.1 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/3.5.4

File hashes

Hashes for Acquisition-4.9-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 30f38817f08b707a145feaf74a388e92fb64a94172a3bfac38e4b661611394df
MD5 0068d2dbb6194ecce20b23881ebe30f5
BLAKE2b-256 9fc3f2b791875aad4bce3f296ff3eeb3f02727b4e169b9b1707da687c3c1b888

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp35-cp35m-win32.whl.

File metadata

  • Download URL: Acquisition-4.9-cp35-cp35m-win32.whl
  • Upload date:
  • Size: 62.8 kB
  • Tags: CPython 3.5m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.7.1 requests/2.25.1 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/3.5.4

File hashes

Hashes for Acquisition-4.9-cp35-cp35m-win32.whl
Algorithm Hash digest
SHA256 51bdb5b149af4c9df6d5e778777c9faa3ee0877f21cf05b3945602e6a29344f1
MD5 d4807be60528dbeabcc889bcc52a9e4e
BLAKE2b-256 c1bd3c1aa5d9eab6f20ea0f8877de0b88cf1b4d2a5243438a3d03bec15d798f4

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp27-cp27m-win_amd64.whl.

File metadata

  • Download URL: Acquisition-4.9-cp27-cp27m-win_amd64.whl
  • Upload date:
  • Size: 63.1 kB
  • Tags: CPython 2.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.7.1 requests/2.26.0 setuptools/44.1.1 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/2.7.17

File hashes

Hashes for Acquisition-4.9-cp27-cp27m-win_amd64.whl
Algorithm Hash digest
SHA256 3ebc3c0b5a93d41a50bfe8fc6ea4702741b22bfc4c3b8e998c36cd0c49bdf8af
MD5 6433e0b52831404059f89185d8061e87
BLAKE2b-256 c7d33b00e4b02ae2ad726a407c9df92aa70caca921510306d13a10860b60b0bb

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp27-cp27m-win32.whl.

File metadata

  • Download URL: Acquisition-4.9-cp27-cp27m-win32.whl
  • Upload date:
  • Size: 61.6 kB
  • Tags: CPython 2.7m, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.7.1 requests/2.26.0 setuptools/44.1.1 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/2.7.17

File hashes

Hashes for Acquisition-4.9-cp27-cp27m-win32.whl
Algorithm Hash digest
SHA256 8ed6121c8ba4c2cd83da798f545422310e3dd84c3277aab176b1d3dc00794f6b
MD5 3b65103e1607a5b01b3318e817648a05
BLAKE2b-256 3df4d5267146680928a8108803975080272ab75d681fc60ba80136d0163ec85f

See more details on using hashes here.

File details

Details for the file Acquisition-4.9-cp27-cp27m-macosx_10_14_x86_64.whl.

File metadata

  • Download URL: Acquisition-4.9-cp27-cp27m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 65.1 kB
  • Tags: CPython 2.7m, macOS 10.14+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.15.0 pkginfo/1.7.1 requests/2.26.0 setuptools/44.1.1 requests-toolbelt/0.9.1 tqdm/4.62.1 CPython/2.7.18

File hashes

Hashes for Acquisition-4.9-cp27-cp27m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 6d05868acbc437e8a4c3cb70c484352471ab6d5521f045994cd7d960c388ed6e
MD5 7dc1a900edec38a4d2336ddffde68df2
BLAKE2b-256 12278afa76a5b873d4d8c12924980c0c82ca8d4e417a5a2fd59de4eaa6f8d9be

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