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.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.8.tar.gz (63.9 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.8-cp39-cp39-win_amd64.whl (65.2 kB view details)

Uploaded CPython 3.9Windows x86-64

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

Uploaded CPython 3.9Windows x86

Acquisition-4.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (121.8 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

Acquisition-4.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (120.5 kB view details)

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

Acquisition-4.8-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.8-cp39-cp39-macosx_10_14_x86_64.whl (65.2 kB view details)

Uploaded CPython 3.9macOS 10.14+ x86-64

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

Uploaded CPython 3.8Windows x86-64

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

Uploaded CPython 3.8Windows x86

Acquisition-4.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (123.4 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARM64

Acquisition-4.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (122.0 kB view details)

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

Acquisition-4.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl (115.3 kB view details)

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

Acquisition-4.8-cp38-cp38-macosx_10_14_x86_64.whl (65.2 kB view details)

Uploaded CPython 3.8macOS 10.14+ x86-64

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

Uploaded CPython 3.7mWindows x86-64

Acquisition-4.8-cp37-cp37m-win32.whl (62.9 kB view details)

Uploaded CPython 3.7mWindows x86

Acquisition-4.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (114.4 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ ARM64

Acquisition-4.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (112.2 kB view details)

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

Acquisition-4.8-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.8-cp37-cp37m-macosx_10_14_x86_64.whl (65.1 kB view details)

Uploaded CPython 3.7mmacOS 10.14+ x86-64

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

Uploaded CPython 3.6mWindows x86-64

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

Uploaded CPython 3.6mWindows x86

Acquisition-4.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (113.4 kB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.17+ ARM64

Acquisition-4.8-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.8-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.8-cp36-cp36m-macosx_10_14_x86_64.whl (65.1 kB view details)

Uploaded CPython 3.6mmacOS 10.14+ x86-64

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

Uploaded CPython 3.5mWindows x86-64

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

Uploaded CPython 3.5mWindows x86

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

Uploaded CPython 2.7mWindows x86-64

Acquisition-4.8-cp27-cp27m-win32.whl (61.7 kB view details)

Uploaded CPython 2.7mWindows x86

Acquisition-4.8-cp27-cp27m-macosx_10_14_x86_64.whl (65.2 kB view details)

Uploaded CPython 2.7mmacOS 10.14+ x86-64

File details

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

File metadata

  • Download URL: Acquisition-4.8.tar.gz
  • Upload date:
  • Size: 63.9 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.8.tar.gz
Algorithm Hash digest
SHA256 e6c3ac9daec2f8a58e15574d89aa66237c09baae9368eb8c285cbcd9cb86c314
MD5 68aa7304815a8ca0ddc43f2e561e2a85
BLAKE2b-256 5d168c0042b1a2bb00c731c9d43117ce0a5cd3fd684e2c31e37bcc38d5d43bef

See more details on using hashes here.

File details

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

File metadata

  • Download URL: Acquisition-4.8-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.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.9.0

File hashes

Hashes for Acquisition-4.8-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 b824e632b38ca9cb7eb116793f0aeda7d171def9872c327cf1026aa8b616ce09
MD5 66445d27793a55f1e8b5b457793bd6e4
BLAKE2b-256 38057dac493552404dc5c5ad2d50ed25414722ce66b7fd236ea08ad5bf589a3c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: Acquisition-4.8-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.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.9.0

File hashes

Hashes for Acquisition-4.8-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 dcbbb5374c8cf0b1f8073c98ac2c5d4cbbd896511f2dc50da59c6fa5cbb1b53e
MD5 02c80b768f968ba0886470a6f0c86a46
BLAKE2b-256 880599935dcc30cebd788545724f3d5410d1f2b1f59bb15b1aa7d824490509cc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-4.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d2bd358146a1ffcec378a42577ffb9b287a707aa730ce8111257e25dfc0ff13f
MD5 ed0b494510c099c8f87c219ee9f85fa9
BLAKE2b-256 e86fad9e819091134b8b2ba8f2ec6311fa358705eb1886360ef7602954e6a232

See more details on using hashes here.

File details

Details for the file Acquisition-4.8-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.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 4b905a150e2beb8c89584152c874f8005766c0c87160472f84df22428b96795d
MD5 19e6f752e3e9a99a58215aecd20b01f2
BLAKE2b-256 7c323c65018228433742d6aca0430c53e588b4495971e85dc61aa68bb784502c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-4.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 8077c17a9ba2c7240106a898d678929880162537262225444126ad45a4e9ec2c
MD5 23406e22d83a8808e56369a5006cf1f6
BLAKE2b-256 bbe72e2012ecac7950762f8a28b4412fff0a5fe721ca19a5d81b8adb3ed943c1

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for Acquisition-4.8-cp39-cp39-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 ae5a6f9d0753bdf88535b80607bec4335ff94473cdd9775a872015afe55018a8
MD5 c01534b36c4f51b7d99cdbe9d6d39980
BLAKE2b-256 fa20d4bf5078bcf80c377104794b3415f8fd8632708005b7518804a87c0bf07c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: Acquisition-4.8-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.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.8.0

File hashes

Hashes for Acquisition-4.8-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 e9499888477f24d0147522d15ebc06214e9f3e80bdbdc192711b283320d6962a
MD5 9f5fbd0afe754a985184d8d3b97bc96f
BLAKE2b-256 bf4fcd6c1a6ec6d3b724a6bea1d61e3020ada89de4488ac6829272e6ccedc206

See more details on using hashes here.

File details

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

File metadata

  • Download URL: Acquisition-4.8-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.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.8.0

File hashes

Hashes for Acquisition-4.8-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 e50875f59cfc8630778bf76724d539cd43453b3ef5e4a7be06df1423cf249fa4
MD5 6c5ad1429a6075a1ac605ef30c4b254a
BLAKE2b-256 934a389fb97c2b65359a6eb35ddc78cdb7adc5865c6d4d0552017374d77df366

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-4.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 fad389a79abad0fb20548a8aae1c18894fb45f44ec2f49f0ec78617bd4f26955
MD5 bdb32b795c81081a4a444a6e63883f9d
BLAKE2b-256 8f301735de6b729720d530c9a4c4468489c117a1bbd9603d3ae79c124f609d50

See more details on using hashes here.

File details

Details for the file Acquisition-4.8-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.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 a025c099e1fb9be5009522bf2447ecf0db72e7c2e2d2485ebf30f011cd8a74d0
MD5 11c48450229c998974246c14a81d8f47
BLAKE2b-256 7142d051a420ff1fa6ff088cad04a0864b077425e1d3fad18f785e026f7e2e93

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-4.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 d2c09be24f5c9524bb05a47d37fbadda10cb5330eccda86e5e6d14c0b8c822df
MD5 f2c3777a2b44a4679314553a48f56f98
BLAKE2b-256 6f005a5603ebb61681f300b08b52b651a7d8940442d18ca3ff6dde636044c7de

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for Acquisition-4.8-cp38-cp38-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 e2c5ddd1768a7280575665081e1c00fb4b31df2185ad2844ad3c3a94657212b8
MD5 2d05428150f44b2c7ccec8258d85e8ab
BLAKE2b-256 0a5240f74dea75bae634512e3145f2217f6cfe969a42b81729ccb02209a313c8

See more details on using hashes here.

File details

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

File metadata

  • Download URL: Acquisition-4.8-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.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.7.5

File hashes

Hashes for Acquisition-4.8-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 43f6997a152a230dea9dc8bd63d79fb0a20cf65386c55a72e8737a8a59562640
MD5 887e2fc5513f4bb132188edf6f477803
BLAKE2b-256 804dbf882141710d8d3e117c2e20001f927bcc36c04fcbd66b7bff9894793b0d

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for Acquisition-4.8-cp37-cp37m-win32.whl
Algorithm Hash digest
SHA256 c8d9635b251d4d0448dc69aeae0a3395ff04df35c4e771f25fa126044dbd6dc4
MD5 17bd420255001c57c94f3d631b80b3b2
BLAKE2b-256 6808dccdb96a693c016b4c1ac45ad020959510066c0502ec01dcf1cc9d577612

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-4.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 04da16ad0f4338745cb5e9557b307d94f5356a4c91c677abf73635e80fae5663
MD5 eb43da3a4dadbd0950b1f8fad906d6bd
BLAKE2b-256 a58209c00cb0c13a38bdbadaea022efde9834a7fd9c213c0ad7ace8808152162

See more details on using hashes here.

File details

Details for the file Acquisition-4.8-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.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 bc9e319c3b24a91fd4bd6686ccb80dd932df0176fa1292e698d9ee7ecf85dc7f
MD5 9800ad34a903dcf6ab61982a4d5d0009
BLAKE2b-256 b2f5426dcdf3a2b586f4a596c8b084d5057844978e8556aceb0dd0c89c759b97

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-4.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 fb8737737d6b258cb8bf12227b77185833dc1f381b8868bd7eac1aa0b4079a3c
MD5 e65056a15b38cb49cb5758eec811e5ba
BLAKE2b-256 b56cbf0a6af05a7edbba24ddc46081fce69b9e5f629584ff3f4c045a2f52ae3b

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for Acquisition-4.8-cp37-cp37m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 1b2e067440e59a8645ca7a120d62876573d1134e51c99450292049ff080499e0
MD5 653dcd50f83f23288f6f34eaa3fed6df
BLAKE2b-256 2b8d7114ba9b8b3b7f4731527349e50b395e23d358e237e2f5762c06ea56791e

See more details on using hashes here.

File details

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

File metadata

  • Download URL: Acquisition-4.8-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.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.6.8

File hashes

Hashes for Acquisition-4.8-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 0ece923d033d755ba3342bf130466829179e44eca6f1c27fde450fd577552f1a
MD5 73954f6fccab8149e388d2b391ec481e
BLAKE2b-256 289f14e2fd5b5deaed820646d8c4b9107da7c1f74615d71b15de7e07ed3103a4

See more details on using hashes here.

File details

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

File metadata

  • Download URL: Acquisition-4.8-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.1 importlib_metadata/4.6.1 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.6.8

File hashes

Hashes for Acquisition-4.8-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 d7b8754eda430ed9670730906fffb691188958a14af2ec4cc8b766aa928359de
MD5 1ffd52cbac9ecc55d6b46c8e517804b2
BLAKE2b-256 ee6fe5e12fcc165cd7f1656f5c6953274d9cebed985fa7e6cff1575fe1e6e11e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-4.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 83a425f8ddf35c9fff3b1f48a34783f58a416d42ec8019b7c353f81902b80d7c
MD5 521b522c3b2ff91adb31aad69aa87f64
BLAKE2b-256 ec2737fcfcc5c5056dafb7f3bb9fe8a578505142c0acb6392177d84be6393073

See more details on using hashes here.

File details

Details for the file Acquisition-4.8-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.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 5539e07518b00871e98bac296ed019c1b2b8c2cb28282acd2c1793dc13c08a22
MD5 ade715592f23ea933ec38c08706eb8dc
BLAKE2b-256 8a41e3951914be5d91e621db07e07d6816690339f568632975d5e9382e7b9018

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-4.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 12e621e220cf2bcd6067d56380f967f29f58f344d956a7b8e279217ace4c5873
MD5 4865a623355e60e940f56a1f9459794c
BLAKE2b-256 bbd8e480bbeb32b0f3666c2ad12a62d2a085b805a97e0afc395a464fae50c506

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for Acquisition-4.8-cp36-cp36m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 9b3c7b08749ff5fcdcb0b605cee833e0bcc5067fc5b73c43ec7391ba6da14b98
MD5 d6cc68abca1bbe0fcfa27b70525a4ab5
BLAKE2b-256 e4329dfe0147978767068b8547360d2bff623182c64234bad352e523b934f74b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: Acquisition-4.8-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.61.2 CPython/3.5.4

File hashes

Hashes for Acquisition-4.8-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 e78e140d7ff7d277f03e8aac777404ee98e31fd9b11884fab4e42e3ca9984ca3
MD5 32e9a0ed0f4bcc5f51ccc27179ba5167
BLAKE2b-256 3b6933f3341460756659071506fb019381624c28de677e0c1e3fa02661ca488d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: Acquisition-4.8-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.61.2 CPython/3.5.4

File hashes

Hashes for Acquisition-4.8-cp35-cp35m-win32.whl
Algorithm Hash digest
SHA256 13b1784b05fad38751b09e768d24d7c08b5fbf3c5e706e6fe53037b53d909e37
MD5 de9d71d20d524d645b73fd0496916b65
BLAKE2b-256 c6de46025fcbb9105c3606af5787a236d3587d5a635990fa85fb86fedad0cc2f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: Acquisition-4.8-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.61.2 CPython/2.7.17

File hashes

Hashes for Acquisition-4.8-cp27-cp27m-win_amd64.whl
Algorithm Hash digest
SHA256 d92de35d6dff3e747270015a5a51320e3461ec6690905b8020e7e6844b57f625
MD5 9f97a2a5639aed9a253bc080ff2a963a
BLAKE2b-256 3270b83fd29905dda4ac7fbf359eb87957caa5cff598dbd8dbc30abcfe2d6be3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: Acquisition-4.8-cp27-cp27m-win32.whl
  • Upload date:
  • Size: 61.7 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.61.2 CPython/2.7.17

File hashes

Hashes for Acquisition-4.8-cp27-cp27m-win32.whl
Algorithm Hash digest
SHA256 f31b2ec3a8df055bdd88b19b0fa41d008ed17c23677828d683e7e6e4a4fbd43c
MD5 2d96ccecfad796480a345a0a27c83a67
BLAKE2b-256 1a3348a2002e028313cacef8a481d799752201224519550af49e39c9d5ea723c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: Acquisition-4.8-cp27-cp27m-macosx_10_14_x86_64.whl
  • Upload date:
  • Size: 65.2 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.61.2 CPython/2.7.18

File hashes

Hashes for Acquisition-4.8-cp27-cp27m-macosx_10_14_x86_64.whl
Algorithm Hash digest
SHA256 80cfdb07e1cba920a1926527dc9517d0e68df860ffc8736c040af15b93944ed8
MD5 98cae415575446b08460a11988f0a983
BLAKE2b-256 d717db3817bb6763d02d65676d53efc97d43554c0625ac70432f82ef1fada735

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