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

6.0 (2024-05-30)

  • Drop support for Python 3.7.

  • Build Windows wheels on GHA.

5.2 (2024-02-13)

  • Add preliminary support for Python 3.13 as of 3.13a3.

5.1 (2023-10-05)

  • Add support for Python 3.12.

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

Uploaded Source

Built Distributions

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

Acquisition-6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (122.0 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

Acquisition-6.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (122.2 kB view details)

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

Acquisition-6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (114.3 kB view details)

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

Acquisition-6.0-cp312-cp312-win_amd64.whl (65.6 kB view details)

Uploaded CPython 3.12Windows x86-64

Acquisition-6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (122.0 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

Acquisition-6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (122.2 kB view details)

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

Acquisition-6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (114.3 kB view details)

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

Acquisition-6.0-cp312-cp312-macosx_11_0_arm64.whl (64.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

Acquisition-6.0-cp312-cp312-macosx_10_9_x86_64.whl (64.9 kB view details)

Uploaded CPython 3.12macOS 10.9+ x86-64

Acquisition-6.0-cp311-cp311-win_amd64.whl (65.5 kB view details)

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

Acquisition-6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (122.8 kB view details)

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

Acquisition-6.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-6.0-cp311-cp311-macosx_11_0_arm64.whl (64.4 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

Acquisition-6.0-cp311-cp311-macosx_10_9_x86_64.whl (64.8 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

Acquisition-6.0-cp310-cp310-win_amd64.whl (65.3 kB view details)

Uploaded CPython 3.10Windows x86-64

Acquisition-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (118.6 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

Acquisition-6.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-6.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-6.0-cp310-cp310-macosx_11_0_arm64.whl (64.4 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

Acquisition-6.0-cp310-cp310-macosx_10_9_x86_64.whl (64.8 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

Acquisition-6.0-cp39-cp39-win_amd64.whl (65.4 kB view details)

Uploaded CPython 3.9Windows x86-64

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

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

Acquisition-6.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-6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (111.6 kB view details)

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

Acquisition-6.0-cp39-cp39-macosx_11_0_arm64.whl (64.4 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

Acquisition-6.0-cp39-cp39-macosx_10_9_x86_64.whl (64.8 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

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

Uploaded CPython 3.8Windows x86-64

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

Uploaded CPython 3.8manylinux: glibc 2.17+ ARM64

Acquisition-6.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-6.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-6.0-cp38-cp38-macosx_11_0_arm64.whl (64.4 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

Acquisition-6.0-cp38-cp38-macosx_10_9_x86_64.whl (64.8 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: Acquisition-6.0.tar.gz
  • Upload date:
  • Size: 65.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.11.7

File hashes

Hashes for Acquisition-6.0.tar.gz
Algorithm Hash digest
SHA256 119fa58b3c13e77cd12356a2e28d335734c4561d4bfac32c88c71e98195fa416
MD5 6836039f70b967ec8e76e11336090dd9
BLAKE2b-256 5bd6ba9d7342713fbd233506f4214f7a0d51946810fd5270e01c06da0085fa71

See more details on using hashes here.

File details

Details for the file Acquisition-6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for Acquisition-6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ba51ab3c8542dbe78d1c0d579786b3147a61227fd3296009130662b9a329ef1f
MD5 0c75582efa99ebfc2ddfa3c541cf5421
BLAKE2b-256 de7268f0ada66b005c78ab1000ca58861c2a0992457950ccede77c425c9e610e

See more details on using hashes here.

File details

Details for the file Acquisition-6.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-6.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a665832481751e6e75cf0f33ec33515fbc53d16e6055ec7ec094031487866da8
MD5 4079993668b7f2a4861c119424fdb34c
BLAKE2b-256 ed5c24b25e70b251f0bad8b846f02531bdc6e873f99ffa8af8e7b19e94bca44f

See more details on using hashes here.

File details

Details for the file Acquisition-6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for Acquisition-6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 99d31bfbef75cab688dfad217e666b98b5a97a6a7a7bf47a5312578aa7b4d1fb
MD5 5e083d1acae812e515594062552c6331
BLAKE2b-256 e83f845c5bc8bd202070c4d2cc8f4102f7217e3bbaab2319464092d47352e0e6

See more details on using hashes here.

File details

Details for the file Acquisition-6.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: Acquisition-6.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 65.6 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.3

File hashes

Hashes for Acquisition-6.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 363ca2c576c6bbd73c8f785c7431e1ff74eafff78c13ca956ea57b814184f4e8
MD5 79b3294af300baecf943eb820638ce18
BLAKE2b-256 6308324560b49bacda3e8aafc0251bfc44f769f8e9fb1b8e1720b825defde779

See more details on using hashes here.

File details

Details for the file Acquisition-6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for Acquisition-6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 998610a943d3636a4d516b83feb8d75a98ee24a25bcca5b1f9472d924fb34510
MD5 54992359bfff2dcbb372bd94efb11989
BLAKE2b-256 903d4a58d85c05a681adaff31bcad1dc9fd95c0d189ce0a97d6a5f0edefa809d

See more details on using hashes here.

File details

Details for the file Acquisition-6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c9014ff86c7f5f574af9186fa766305063b9848637b26c25040ae0f6ff3737b9
MD5 c73264b06357507b4835cd37aef1b306
BLAKE2b-256 7b74e5a8c1b002ebd32f5a501eb8d8faac0268b96356064b9eb47f115c32e17b

See more details on using hashes here.

File details

Details for the file Acquisition-6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for Acquisition-6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 b00ba164419434a74a94f334366be52cc9c5de5c01725d40d884646499ecbfc7
MD5 35fa8bdbfb1e0f5281b8bc686a76ce96
BLAKE2b-256 32a70c3469f366ee96de5242b3f09bfef45d9b3c8ca2896151bea7988bd718e3

See more details on using hashes here.

File details

Details for the file Acquisition-6.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for Acquisition-6.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 88b30739ddcc7668ba91a02913c1870cfe0de04cdb67103fd15e269fe582d17e
MD5 a0dee2beab877ddd098aca386ccdafd4
BLAKE2b-256 252f3015bbea5faff6db382a0fbfeb4c82169c2891b86b0c23c6e5150ff27b88

See more details on using hashes here.

File details

Details for the file Acquisition-6.0-cp312-cp312-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for Acquisition-6.0-cp312-cp312-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f907ed1dc647b8c6344071d6ed2353cd8816726f6d513b4e64d789e2c810d16f
MD5 7af6cd6c174af957c4dd0fa16cda5c7e
BLAKE2b-256 8e1d574437612d253b0103b9356d3a486bdded1b9e4d0846d46c9ad2b273dbff

See more details on using hashes here.

File details

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

File metadata

  • Download URL: Acquisition-6.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 65.5 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.11.9

File hashes

Hashes for Acquisition-6.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 ef9f4b055f2e55c0ea927eeb46fa6614f545466ca2803a6a47f54fb398f2a969
MD5 7c2fe1d1ca305a8fc50100d2f7755e95
BLAKE2b-256 270c20537bc232ab09cd00601a6fa32848aee2c2a196b4ec825c60117fb5b0ed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0ab5054b95341980754c09aa6aeb62ddf8f3aa25568fe6f96f826f4b47a4c578
MD5 1ab1290be00b0a169e964b1b961d2319
BLAKE2b-256 e42004e6e59a6789fa83a6b0b0c43cae627a58beeac0a5649dd7c4f3f9f77647

See more details on using hashes here.

File details

Details for the file Acquisition-6.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-6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 242046928a91cacd4fd748371e2d423f5458d5972e8efdbf42d389968e6b8c5e
MD5 ca4ee713247812592b54c7f9bcba9760
BLAKE2b-256 7116e93441e54868b6534f15136be8016c8fce576e1016dbb98b87fd596b5db2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 2c2b63c2b53de6093766348ef142b7d7dc019eab792f4478b2fdfd22baa1da08
MD5 726c5a1c153929e20d0ed4b75a0edb95
BLAKE2b-256 e288865f42554e4f4468f30a70f6939c1cae528158b775f444d5ed17846d6a62

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-6.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f8cc76fca89eae61fdb9d183248451421e98e084bf97fc4bd17df33b75fbce53
MD5 1d381f72c0f2aea1e4ad06084e1f89c5
BLAKE2b-256 cc33376372d737293a50edcc318b9d4f6f76727cef2dea65be0039f8ee3b950e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-6.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 86069ae8c2c6a98ffca6b0047e1d9d1b4d44c8b98e2087cd532ec8c4cbc4986d
MD5 9f732b758852510819c308c656ad0d68
BLAKE2b-256 c465d4c4b0548aff466f912b5a2c4faef66173a26795c9f567fb5782dea54996

See more details on using hashes here.

File details

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

File metadata

  • Download URL: Acquisition-6.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 65.3 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.10.11

File hashes

Hashes for Acquisition-6.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 527c7c503e289ac61346d8c8fb038cf4486cca5ab8f709176786d5458cf6af5c
MD5 4a4b13f0c7388ce331c6a647f046b993
BLAKE2b-256 adea514cc70ac37dab038dd2e493ab377864c6e21efe7428b0ce5e0575116ee5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 aca2a841e5b0415961a0ef793bbb4f0f426ddd078c1e272c420c0101db1dabf8
MD5 f01672d8ea65726842443dbbef592e86
BLAKE2b-256 fe7edc984f173a80785ef80b79b990c9e969af96a38aa5ce5708826f5f282afe

See more details on using hashes here.

File details

Details for the file Acquisition-6.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-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a2c3e2e96e38f36bafa317a7e8f02222829874f2617fa44795d45fdb7e3c33b1
MD5 b77bf9e938ce1fbd1c8b6e582a650575
BLAKE2b-256 1ecea29dfc01a3da77db03fd52e9ae0664cf5b3ddc20b11fb0341e03facfc1f1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 41feb45c75f312c1eeb43ae0a0afea03f5384749d8f80c184e64a76b8cdd7978
MD5 7b795bee9bfe711cc14b42f053255526
BLAKE2b-256 8673720c00f7199d878b1bcdf1b6c1646a7359f63193310e658401f9802e24d5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-6.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ce5478ba2f98c6b9989695e5f8b25a16021c731dc1c575329a831072dc693399
MD5 0f3d7488606b562a8341917b3e4c2e4d
BLAKE2b-256 7e957b9abc7bea6fa82ba6f8c4e89ece5f3d214ed55640529c5661ef9e3dfdea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-6.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 61206d6ab4b89514d03ebc952053ed230f4a269ea09696b502181e1e2a450d3e
MD5 ac8deb2fd7dea16c2e9a81e16f5c64ed
BLAKE2b-256 4a30ebfcacafb9615a1bb126af7a0ed4643acbe449ce2d397003b2c9440a642d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: Acquisition-6.0-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 65.4 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.9.13

File hashes

Hashes for Acquisition-6.0-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 f61a3765ec3c435f269b8687a89752af69631fff3509e250c5764f6348b70552
MD5 0af77d66d80e1856268e2088f5bf7cfb
BLAKE2b-256 5385c47146d68169fe970d8cbbd1447c76124f9b61c4f1fee28b521487faadd3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 bb3c98184471d146c75c4614abe40428a6486e59df85f4d256e8d5316a38b68e
MD5 674af2cf25c6b100aadb0db97bc1e7ef
BLAKE2b-256 7e1f4940618bd4532b437178554523c420ff7acb325ba9c82830262f7ff4b870

See more details on using hashes here.

File details

Details for the file Acquisition-6.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-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0059c1b28188ffba472d8a6a0ada92f6886e75a0b341f1fb81bcde049bca2799
MD5 9378b6520d395ea2b85bfa80cb3edeb8
BLAKE2b-256 08cec0f1cdd92515eb69da9d5a8c382b52e5f1267b70539c6028c0724c108a22

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 a0d08ca982aabcce6f15fe438db1f198025818518431998817d0c5f308d73732
MD5 836ba6dbe1b7e40cb883f90365dd3f52
BLAKE2b-256 713f407306320ee3352d592da9a30fb0eb00e29effb96c88e77b4a16e7856615

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-6.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2f53bebfa22f27883a787da872f9b404c94f17f022234abb1364f5643eeb07f6
MD5 8d78e303dbaf30514452430eb9887e45
BLAKE2b-256 a071b2dc44e118a6211e9ff3fe4b58a2f17ffc450c60f3357ac16c79674f23e7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-6.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1b2c03c39d54838d15abfa7615444d3f6c8d4b9acb2a3036716640f9c2becd45
MD5 c6c2a7fc2cf95bf710bcfc0fe62405c6
BLAKE2b-256 fc77a239f069ddccf3e4d5c7dbb4a0cf7137e9e25246896fd4aca93958a7449b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: Acquisition-6.0-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/5.1.0 CPython/3.8.10

File hashes

Hashes for Acquisition-6.0-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 7e8cc36e54e6d8931761b944a9167bba6228d02443f70eb2688b26980fd79414
MD5 439373d52ab324fd1c820be9eaa827d1
BLAKE2b-256 de6f1df1bd45ad23190ab28abcecacb64270856ea71767c7c49513a31fd7e979

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c746c9d24c48ef4770901accdd598f211c03caa8d2ff49b174d26bce40420005
MD5 7f1c21f6474337a93fbd04cfce1cc083
BLAKE2b-256 02e54fe2d456fe1b8c464007297b2ebf81fe0a1f35285c48489f1f376591e79f

See more details on using hashes here.

File details

Details for the file Acquisition-6.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-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e678f407c8afbc709b1b7979205c1e99260f9b2508730cfc5f17d4265a3b44b9
MD5 82cf0a8379d80f4b2580a49c2ca21743
BLAKE2b-256 335d9ceef7835dedff45532662423dd68ea05e7f5a308213872e9b919b49737b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 7c9b4abcd98f971523dacf01faa30c82bc79612f235427d5b3321bfad91d1941
MD5 e4ae256c28de62fdc3ad39569b40c1e0
BLAKE2b-256 c110fd18f7d597f6db22db01c7108c1ccbae7b84df05ae9eeb95e0291246e185

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-6.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 600fff93883ff98c125fd0d41dc58ef3fda78f7df48a58763cbe2594d78f3cfc
MD5 98eb6263d492cc62a84c1d0be5288ecb
BLAKE2b-256 00ec25738166cef8872e3890b2eb4273ce0e6c076ebba9fdf5aef7e657d6bc6c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for Acquisition-6.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 3d6b2fbc3eaf7ec4b53788210d012d4b903eb850152600b6b5df340910f60108
MD5 c197e8319d2a3ee0a88af5e44ed1c2fb
BLAKE2b-256 a71c591ea0c921cc04f2421f3ea80d22b7f4df9d1ed3d70a7ae4dc6192e48bab

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