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

5.0 (2023-03-24)

  • Build Linux binary wheels for Python 3.11.

  • Drop support for Python 2.7, 3.5, 3.6.

  • Add preliminary support for Python 3.12a5.

4.13 (2022-11-17)

  • Add support for building arm64 wheels on macOS.

4.12 (2022-11-03)

  • Add support for final Python 3.11 release.

4.11 (2022-09-16)

  • Add support for Python 3.11 (as of 3.11.0rc1).

  • Switch from -Ofast to -O3 when compiling code for Linux wheels. (#64)

4.10 (2021-12-07)

  • Fix bug in the PURE_PYTHON version affecting aq_acquire applied to a class with a filter.

  • Improve interface documentation.

  • Add support for Python 3.10.

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-5.0.tar.gz (65.7 kB view details)

Uploaded Source

Built Distributions

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

Acquisition-5.0-cp311-cp311-win_amd64.whl (65.1 kB view details)

Uploaded CPython 3.11Windows x86-64

Acquisition-5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (122.3 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

Acquisition-5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (122.9 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

Acquisition-5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (115.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

Acquisition-5.0-cp311-cp311-macosx_11_0_arm64.whl (64.9 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

Acquisition-5.0-cp311-cp311-macosx_10_9_x86_64.whl (65.5 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

Acquisition-5.0-cp310-cp310-win_amd64.whl (65.0 kB view details)

Uploaded CPython 3.10Windows x86-64

Acquisition-5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (118.7 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

Acquisition-5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (119.3 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64manylinux: glibc 2.5+ x86-64

Acquisition-5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (112.3 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ i686manylinux: glibc 2.5+ i686

Acquisition-5.0-cp310-cp310-macosx_11_0_arm64.whl (64.9 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

Acquisition-5.0-cp310-cp310-macosx_10_9_x86_64.whl (65.5 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

Acquisition-5.0-cp39-cp39-win_amd64.whl (65.0 kB view details)

Uploaded CPython 3.9Windows x86-64

Acquisition-5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (118.0 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

Acquisition-5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (118.7 kB view details)

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

Acquisition-5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (111.7 kB view details)

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

Acquisition-5.0-cp39-cp39-macosx_11_0_arm64.whl (64.9 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

Acquisition-5.0-cp39-cp39-macosx_10_9_x86_64.whl (65.5 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

Acquisition-5.0-cp38-cp38-win_amd64.whl (65.0 kB view details)

Uploaded CPython 3.8Windows x86-64

Acquisition-5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (119.0 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARM64

Acquisition-5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (119.7 kB view details)

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

Acquisition-5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (112.7 kB view details)

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

Acquisition-5.0-cp38-cp38-macosx_11_0_arm64.whl (65.0 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

Acquisition-5.0-cp38-cp38-macosx_10_9_x86_64.whl (65.5 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

Acquisition-5.0-cp37-cp37m-win_amd64.whl (65.0 kB view details)

Uploaded CPython 3.7mWindows x86-64

Acquisition-5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (109.7 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ ARM64

Acquisition-5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (109.2 kB view details)

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

Acquisition-5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (102.2 kB view details)

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

Acquisition-5.0-cp37-cp37m-macosx_10_15_x86_64.whl (65.5 kB view details)

Uploaded CPython 3.7mmacOS 10.15+ x86-64

File details

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

File metadata

  • Download URL: Acquisition-5.0.tar.gz
  • Upload date:
  • Size: 65.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.16

File hashes

Hashes for Acquisition-5.0.tar.gz
Algorithm Hash digest
SHA256 0cd4f5156e1d0f9e085e1c676aeb006a8474057d7f656d8c6cc858788a48b699
MD5 0fbd26fae19b9c6aaad8b05b183cd906
BLAKE2b-256 d96f3551e353c5a52a6ac6bf94a502537470c3d77ac3b8b8401b3264c01a467c

See more details on using hashes here.

File details

Details for the file Acquisition-5.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: Acquisition-5.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 65.1 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.0

File hashes

Hashes for Acquisition-5.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 7d5d90f45931100e781664c63204b91572c178090b269e9cff47fbd037001316
MD5 bbbbba8ccad561a2afa21c56a8bdf0a1
BLAKE2b-256 558ee6fe909dc70625af6b1a3d6e12cc8d16fa4dd7f254da9bf763a2ff147b0a

See more details on using hashes here.

File details

Details for the file Acquisition-5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for Acquisition-5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d87785b70a0229cd791069e56e2dd9d1f35a973f9491bed97d7a6b24b54db6ad
MD5 19f4fe7b29c4275d13c5ccf063af3fc8
BLAKE2b-256 5c32ad343ceba7406fa62026dfb244490f808b2d7998bfebbfbac76abf17f678

See more details on using hashes here.

File details

Details for the file Acquisition-5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 54d7d8c46dfec5d24095b89369c5067f64d20324ed4831957caba8b14992aba6
MD5 bd4881a4b4e239d806a001a1d9edd0ba
BLAKE2b-256 22b9b08c64183b6217b315ceb66740192e1aeae81ab9d4ecc82f05ae91eda2c7

See more details on using hashes here.

File details

Details for the file Acquisition-5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for Acquisition-5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 5e77694f076c2fa52b183667c185944f59a94a0ab44c4134fbf93decba0f55aa
MD5 0556604c84a848d5ff659e9ff1bea1d1
BLAKE2b-256 1e4376377e1e0925b3f5c56d150a7246868802f432f445c33cac5354377522b5

See more details on using hashes here.

File details

Details for the file Acquisition-5.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for Acquisition-5.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 77a3aa7884afb566cbb2fb61512a3e94dbd1cf9c1ca9fb697445d297109aab9f
MD5 7285df92345650837abe277a96a405bd
BLAKE2b-256 24c1ea11033e896e20c0bdc4bd7128430b9d8b8f324e0d61b6b2c2f82d992be4

See more details on using hashes here.

File details

Details for the file Acquisition-5.0-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-5.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f4f79ce5936dae7e8fbfbf567100fb4e002168a08423f8da8692b323ea36d548
MD5 ce931b5930711208635c4ae7bf15e4ef
BLAKE2b-256 6b0286a1fafecf44a0a04729ff68811283a3f8426412df0584644d5e518090e2

See more details on using hashes here.

File details

Details for the file Acquisition-5.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: Acquisition-5.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 65.0 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.0

File hashes

Hashes for Acquisition-5.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 2d630c9856b53a58565c16b8ce43aa3c57686951d62a10539f77b65e18a29c9a
MD5 c2caf9297b139e20e55002901623aa60
BLAKE2b-256 69d87c1f229fd24014b8980a032159a869d7787405af84d84911b50dd8c0caca

See more details on using hashes here.

File details

Details for the file Acquisition-5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for Acquisition-5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 873423ef2289332e86dc4a59764908dc39f7813eac4d9103af3ed2be0f5d3f81
MD5 4b8043e41a8a732c19d24dbe7177c182
BLAKE2b-256 14d56fc1598945bff72dad02ae2a40bc6f59a1e82cdda661cb5d9c9338d75681

See more details on using hashes here.

File details

Details for the file Acquisition-5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 271a4d5ab6caf9b05dfa8987b130e472c3676263620835446390148d0f63c613
MD5 d03eb4355d384fd7ceb7a80f9357be9c
BLAKE2b-256 b15be5f476e44ce39a40febf3752d2dfe8ec8397feb05d33af36ba8f510c39cd

See more details on using hashes here.

File details

Details for the file Acquisition-5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for Acquisition-5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 9a3b0feb70124550b5728fd237a831e9128332bd61204a600a7d52a6ff557da2
MD5 9eda2e007aa7724b895b055fb5a27a2a
BLAKE2b-256 e8c66733bee8b8f2424c29b0ff8d89cd16ea92073121ddc938492adff20931fe

See more details on using hashes here.

File details

Details for the file Acquisition-5.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for Acquisition-5.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1b04a319855a2b1b427bc3de9b267610cd4a5779b865b5b530341b620456b337
MD5 aaab86d28f614a3c5188cd7e247e187f
BLAKE2b-256 93935438ce3289894a31740e0d8bb00971fdeac154308f3d82b126cafbd26451

See more details on using hashes here.

File details

Details for the file Acquisition-5.0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-5.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f13113ab9c409a78586994f52a45c7f72536fb7e609a06dca57ec1f7a8616522
MD5 daf18157ddf67be478545883d5884b50
BLAKE2b-256 9218dd36915d335f144e52a8d099b99da7c107a8550ad5dbc5202d36ec9e1a36

See more details on using hashes here.

File details

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

File metadata

  • Download URL: Acquisition-5.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 65.0 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.0

File hashes

Hashes for Acquisition-5.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 ae6085cd5a4c2f7bc74ec1874e537edd9e247752d4f5b6d8b2a9ce988bc6ce0c
MD5 be5d83b14089a8a486f5732e46b25b69
BLAKE2b-256 02d58515232bfb3b011c92cc7f9c533ed68c80095039f6c33dd96ecbda30430f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 714b285fa7f4ded3d4d0ff47a3cc963fd2c9e94a0316b2c36475cf100a84089a
MD5 cf7ab6c8fa81285c7a47ee4fd00f9a01
BLAKE2b-256 515596f3974cbac9d399dfe0da57e9d38477fb881cb715736a0ced1d2463abcd

See more details on using hashes here.

File details

Details for the file Acquisition-5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cece3c5a970f3c54caf16888eba4d6cd07c6bcc4d997e61de52f0b8728021f76
MD5 a41a35f84bd612018669abf24aedfba7
BLAKE2b-256 bc801a5d1836de8761bc78c0b4c77f25043f221825e2a13f267409b07be57fd9

See more details on using hashes here.

File details

Details for the file Acquisition-5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for Acquisition-5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 a4aa3f43de1f6d6539a892b1d121b763a27c18fb064d0e1ee861363db13a1f00
MD5 51d23021c132ceee1130ace56d75200f
BLAKE2b-256 dcf70f1e8e2a2b09595d21a9333ee8d5595dab741854a286e6a314976fb8105e

See more details on using hashes here.

File details

Details for the file Acquisition-5.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for Acquisition-5.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 179b002456be265ec9578494d6a1b0f8bb298c7bbf5caff49f1b67d66aac19c1
MD5 41d4f2ab5fc94fae02077b45bb570321
BLAKE2b-256 ac51dec5373dfbe4d22689173dd37a515ebfbe8342d097b77b04063911edf9a3

See more details on using hashes here.

File details

Details for the file Acquisition-5.0-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-5.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f0814b1b1e87391586037f4c9eed0f6399cf7f4ffdc5c52a950628ef7eebf516
MD5 9495b14fa2b032aca1bb3c979cf9f689
BLAKE2b-256 3f9c6709b3b4b959487875ad9d0c94621cc21a8ac24b9e517dafa6bb2620ff7f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: Acquisition-5.0-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 65.0 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.8.0

File hashes

Hashes for Acquisition-5.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 077e193db06cf45f3b32270c43988e81bf6fd1e9fa5588de23194fe97ede0ef6
MD5 c8cfb97555d4968375a1f5e03a54e4bb
BLAKE2b-256 ed2e3f7573ad30a2ed31c7814b8a7191da792a44d38a0299b6fadf077a56e043

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 82d6612df96c60ddfed6700e49ffd8dc144b14ff09ac75c3017506327b6196b8
MD5 640170c6a1790312357cb207457ed5c3
BLAKE2b-256 867bbddfde78adeb867614edba23d1a9146dc2c2a26b2476ad47f96e0110accc

See more details on using hashes here.

File details

Details for the file Acquisition-5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 64c0cdacbdbbab099cba88b986b796987e1b87ceb77edadb310cb31d73bc60ae
MD5 115fec811a9efc0fb0bc148467abef91
BLAKE2b-256 5d5b9a8bddd817ee5619e4aaa2cb0dcc06c4438d2eba2b896b926cacc0dde5f9

See more details on using hashes here.

File details

Details for the file Acquisition-5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for Acquisition-5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 10793be190cfa58e8d03f314daa81762ac7acbe6d91d0c721ad9ac17f970cb80
MD5 d7d8e3e357db8730aa9b4afb878f72ba
BLAKE2b-256 82e822af88d24bfb53e2137d89311bf2f59053d9e5d86e051b487887ed0238fe

See more details on using hashes here.

File details

Details for the file Acquisition-5.0-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for Acquisition-5.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e3ad847a2fb893c4579cdd2107c06d18ae1de755db284cf9c13daa63eacee542
MD5 10941b6fd3408fe460dc8c20591e0f04
BLAKE2b-256 11d4568c988078488d3957cf92b85c58d8402872ba5d58906e54200760a2d52f

See more details on using hashes here.

File details

Details for the file Acquisition-5.0-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-5.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 5ecdc0301522a705b4a07941031891202ddb4aa013a3ccf5eae1cce963a8129c
MD5 e18c7f91d0e0adf675ac265d1d027cb6
BLAKE2b-256 997bee31db4d6ebb297a1ed1d932bc60b7a01c247895066c4d3827a4822e7df2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: Acquisition-5.0-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 65.0 kB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.7.5

File hashes

Hashes for Acquisition-5.0-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 6cce05db15e2a067eb2e30db9d6a05f03886cae1cd27e054c58df89e0e229f74
MD5 62ee41760ce85ca4d8a6d1ffcb36f7ca
BLAKE2b-256 0fae73091bf2d834634a189b5fa1975434a958674bd375dae28de3843f866139

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 9cec6ce97e1d5ba4a19c38d2a9e461244af0b6ff261d2f10ddcffe1cc781ddca
MD5 cd1e69b39c939ae5911688d07b3bc650
BLAKE2b-256 1e0c48d73d95ab5e15a9d114f41481ee562ebe59d9dc0dd657e1e7d846abf2c5

See more details on using hashes here.

File details

Details for the file Acquisition-5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 68b0627400e798b092d5933a5f006c5ab6776d6407fb13ca0da37f44f1af96ac
MD5 8d67b28e5f785f2db33561df924ec865
BLAKE2b-256 6cb28ecf7c47a510908d79699271b21fe5cd7f0dff3c910eb546e517018a7eef

See more details on using hashes here.

File details

Details for the file Acquisition-5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for Acquisition-5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 9969530117c63109b7a0ca7989b5f2c2bbc0a132fa1b257cff460c2617d87865
MD5 635d842fe4c3cadce483b00bea768a46
BLAKE2b-256 48fa43d2acd0ab336bc7745539a837006aa2d5ded355c9b789b27fd206805770

See more details on using hashes here.

File details

Details for the file Acquisition-5.0-cp37-cp37m-macosx_10_15_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-5.0-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 ab86df3654812c2b8b6a44cf2fc2e33338d2c60f2b18e00d58b429af68a4323c
MD5 f6c32c692547f312f024b2f093452aed
BLAKE2b-256 aeba8b2d8a220b52cca6d8bd1874b891395080c911e2925598c63d7687526e4b

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