Skip to main content

bocpy is a Python extension that adds Behavior-oriented concurrency built on top of cross-interpreter data.

Project description

bocpy

BOC Logo

Behavior-Oriented Concurrency (BOC) is a new paradigm for parallel and concurrent programming which is particularly well-suited to Python. In a BOC program, data is shared such that each behavior has unique temporal ownership of the data, removing the need for locks to coordinate access. For Python programmers, this brings a lot of benefits. Behaviors are implemented as decorated functions, and from the programmer's perspective, those functions work like normal. Importantly, the programmer's task shifts from solving concurrent data access problems to organizing data flow through functions. The resulting programs are easier to understand, easier to support, easier to extend, and unlock multi-core performance due to the ability to schedule behaviors to run efficiently across multiple processes.

BOC has been implemented in several languages, including as a foundational aspect of the research language Verona, and now has been implemented in Python.

Getting Started

You can install bocpy via PyPi:

pip install bocpy

We provide pre-compiled wheels for Python 3.10 onwards on most platforms, but if you have problems with your particular platform/version combination, please file an issue on this repository.

[!NOTE] the bocpy library depends on the Cross-Interpreter Data mechanism, which was introduced in Python 3.7. We explicitly test and provide wheels for all versions of Python that have not been end-of-lifed (3.10.19 as of time of writing is the oldest version we support). The library may not work in older versions of Python.

A behavior can be thought of as a function which depends on zero or more concurrently-owned data objects (which we call cowns). As a programmer, you indicate that you want the function to be called once all of those resources are available. For example, let's say that you had two complex and time-consuming operations, and you needed to act on the basis of both of their outcomes:

def buy_cheese():
    logger = logging.getLogger("cheese_shop")
    for name in all_known_cheeses():
        if is_available(logger, name):
            return name
    
    cleanup_shop(logger)
    return None


def order_meal(exclude: str):
    logger = logging.getLogger("greasy_spoon")
    for dish in menu():
        logger.info(dish)
        if exclude.lower() not in dish.lower():
            logger.info(f"That doesn't have much {exclude} in it")
            return dish

        vikings(logger)
        if random.random() < 0.3:
            logger.info("<bloody vikings>")

    return None


cheese = buy_cheese()
meal = order_meal(exclude="spam")

if meal is not None:
    eat(meal)
elif cheese is not None:
    eat(cheese)

if meal is not None:
    print("I really wanted some cheese...")
elif cheese is not None:
    print("Cheesy comestibles")

return_to_library()

The code above will work, but requires the purveying of cheese and the navigation of the menu for non-spam options to happen sequentially. If we wanted to do these tasks in parallel, we will end up with some version of nested waiting, which can result in deadlock. With BOC, we would write the above like this:

from bocpy import wait, when, Cown

# ...

def buy_cheese():
    cheese = Cown(None)

    @when(cheese)
    def _(cheese):
        logger = logging.getLogger("cheese_shop")
        for name in all_known_cheeses():
            if is_available(logger, name):
                cheese.value = name
                return

        cleanup_shop(logger)

    return cheese


def order_meal(exclude: str):
    order = Cown(None)

    @when(order)
    def _(order):
        logger = logging.getLogger("greasy_spoon")
        logger.info("We have...")
        for dish in menu():
            logger.info(dish)
            if exclude.lower() not in dish.lower():
                logger.info(f"That doesn't have much {exclude} in it")
                order.value = dish
                return

            vikings(logger)
            if random.random() < 0.3:
                logger.info("<bloody vikings>")

    return order


cheese = buy_cheese()
meal = order_meal(exclude="spam")


@when(cheese, meal)
def _(cheese, meal):
    if meal.value is not None:
        eat(meal.value)
    elif cheese.value is not None:
        eat(cheese.value)
    else:
        print("<stomach rumbles>")


@when(cheese, meal)
def _(cheese, meal):
    if meal.value is not None:
        print("I really wanted cheese...")
    elif cheese.value is not None:
        print("Cheesy comestibles!")

    return_to_library()


wait()

You can view the full example here

The underlying BOC scheduler ensures that this operates without deadlock, by construction.

Examples

We provide a few examples to show different ways of using BOC in a program:

  1. bocpy-bank: Shows an example where two objects (in this case, bank accounts), interact in an atomic way.
  2. bocpy-dining-philosophers: The classic Dining Philosphers problem implemented using BOC.
  3. bocpy-fibonacci: A parallel implementation of Fibonacci calculation.
  4. bocpy-cooking-boc: The example from the BOC tutorial.
  5. bocpy-boids: An agent-based bird flocking example demonstrating the Matrix class to do distributed computation over cores. Note: you'll need to install pyglet first in order to run the bocpy-boids example.

Why BOC for Python?

For many Python programmers, the GIL has established a programming model in which they do not have to think about the many potential issues that are introduced by concurrency, in particular data races. One of the best features of BOC is that, due to the way behaviors interact with concurrently owned data (cowns), each behavior can operate over its data without a need to change this familiar programming model. Even in a free-threading context, BOC will reduce contention on locks and provide programs which are data-race free by construction. Our initial research and experiments with BOC have shown near linear scaling over cores, with up to 32 concurrent worker processes.

This library

Our implementation is built on top of the subinterpreters mechanism and the Cross-Interpreter Data, or XIData, API. As of Python 3.12, sub-interpreters have their own GIL and thus run in parallel, and thus BOC will also run fully in parallel.

In addition the providing the when function decorator, the library also exposes low-level Erlang-style send and selective receive functions which enable lock-free communication across threads and subinterpreters. See the bocpy-primes and bocpy-calculator examples for the usage of these lower-level functions.

Additional Info

BOC is built on a solid foundation of serious scholarship and engineering. For further reading, please see:

  1. When Concurrency Matters: Behaviour-Oriented Concurrency
  2. Reference implementation in C#
  3. OOPSLA23 Talk

Trademarks This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow Microsoft’s Trademark & Brand Guidelines. Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies.

Project details


Download files

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

Source Distribution

bocpy-0.2.2.tar.gz (89.9 kB view details)

Uploaded Source

Built Distributions

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

bocpy-0.2.2-cp314-cp314-win_amd64.whl (111.8 kB view details)

Uploaded CPython 3.14Windows x86-64

bocpy-0.2.2-cp314-cp314-win32.whl (109.1 kB view details)

Uploaded CPython 3.14Windows x86

bocpy-0.2.2-cp314-cp314-musllinux_1_2_x86_64.whl (270.4 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

bocpy-0.2.2-cp314-cp314-manylinux_2_28_x86_64.whl (273.3 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

bocpy-0.2.2-cp314-cp314-macosx_14_0_x86_64.whl (114.3 kB view details)

Uploaded CPython 3.14macOS 14.0+ x86-64

bocpy-0.2.2-cp314-cp314-macosx_11_0_arm64.whl (110.0 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

bocpy-0.2.2-cp313-cp313-win_amd64.whl (110.6 kB view details)

Uploaded CPython 3.13Windows x86-64

bocpy-0.2.2-cp313-cp313-win32.whl (107.6 kB view details)

Uploaded CPython 3.13Windows x86

bocpy-0.2.2-cp313-cp313-musllinux_1_2_x86_64.whl (270.1 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

bocpy-0.2.2-cp313-cp313-manylinux_2_28_x86_64.whl (273.1 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

bocpy-0.2.2-cp313-cp313-macosx_14_0_x86_64.whl (114.4 kB view details)

Uploaded CPython 3.13macOS 14.0+ x86-64

bocpy-0.2.2-cp313-cp313-macosx_11_0_arm64.whl (109.9 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

bocpy-0.2.2-cp312-cp312-win_amd64.whl (110.7 kB view details)

Uploaded CPython 3.12Windows x86-64

bocpy-0.2.2-cp312-cp312-win32.whl (107.6 kB view details)

Uploaded CPython 3.12Windows x86

bocpy-0.2.2-cp312-cp312-musllinux_1_2_x86_64.whl (270.1 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

bocpy-0.2.2-cp312-cp312-manylinux_2_28_x86_64.whl (273.1 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

bocpy-0.2.2-cp312-cp312-macosx_14_0_x86_64.whl (114.4 kB view details)

Uploaded CPython 3.12macOS 14.0+ x86-64

bocpy-0.2.2-cp312-cp312-macosx_11_0_arm64.whl (109.9 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

bocpy-0.2.2-cp311-cp311-win_amd64.whl (110.6 kB view details)

Uploaded CPython 3.11Windows x86-64

bocpy-0.2.2-cp311-cp311-win32.whl (107.6 kB view details)

Uploaded CPython 3.11Windows x86

bocpy-0.2.2-cp311-cp311-musllinux_1_2_x86_64.whl (268.0 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

bocpy-0.2.2-cp311-cp311-manylinux_2_28_x86_64.whl (270.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

bocpy-0.2.2-cp311-cp311-macosx_14_0_x86_64.whl (114.5 kB view details)

Uploaded CPython 3.11macOS 14.0+ x86-64

bocpy-0.2.2-cp311-cp311-macosx_11_0_arm64.whl (110.2 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

bocpy-0.2.2-cp310-cp310-win_amd64.whl (110.7 kB view details)

Uploaded CPython 3.10Windows x86-64

bocpy-0.2.2-cp310-cp310-win32.whl (107.7 kB view details)

Uploaded CPython 3.10Windows x86

bocpy-0.2.2-cp310-cp310-musllinux_1_2_x86_64.whl (259.4 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

bocpy-0.2.2-cp310-cp310-manylinux_2_28_x86_64.whl (263.0 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

bocpy-0.2.2-cp310-cp310-macosx_14_0_x86_64.whl (114.7 kB view details)

Uploaded CPython 3.10macOS 14.0+ x86-64

bocpy-0.2.2-cp310-cp310-macosx_11_0_arm64.whl (110.3 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file bocpy-0.2.2.tar.gz.

File metadata

  • Download URL: bocpy-0.2.2.tar.gz
  • Upload date:
  • Size: 89.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.2.2.tar.gz
Algorithm Hash digest
SHA256 14cb3b4dc539fb0498739337b92728096c70073e3314fc8d5c1813aa8d693ad2
MD5 5d5b1e813afe4d08cb74583412fb0180
BLAKE2b-256 0b6fb675ccfdcc0210837186c1c9f4629585cb8b6e39943a2b68e12b4477f294

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: bocpy-0.2.2-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 111.8 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.2.2-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 5bf5df29f6def1c624ab8986eb951e670c443cd1633d4503d46aa04a35ac8e70
MD5 66b815b490573e2305b9cc84f9ad22dc
BLAKE2b-256 b57af94be73e667ec3a08bd2ba601ccf1d3697dcc938b2970d9285406b4ff404

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp314-cp314-win32.whl.

File metadata

  • Download URL: bocpy-0.2.2-cp314-cp314-win32.whl
  • Upload date:
  • Size: 109.1 kB
  • Tags: CPython 3.14, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.2.2-cp314-cp314-win32.whl
Algorithm Hash digest
SHA256 5de60e83f4cca108c73c22bff4a224426b1d052c22a2c183b93b06b3ff058372
MD5 13d6424aa203eb4b7e6ae6df1100deb9
BLAKE2b-256 3ee96d11559f5cd9f1b3bda1f49313f61809351b47bb8aaffdb828a54159fba7

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.2.2-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 4a173efabc0769821c46740269fd377624ee4f0a1e58ea43667c495e183cb524
MD5 7e66a02a53862e550d7f63b30d09820b
BLAKE2b-256 2ff603a8d8938beacf6f84cc19e7cf5706012bc2deb02e62b6114a84ad15b050

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.2.2-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e779485fec2fc46491b7a453f1dfcd53a2afce688b78265322decd5144c2593a
MD5 70153442f7d6125d84abaad2805b9aa8
BLAKE2b-256 48f8db2d33f57b841d09ff42cf822c5cddacc322374da7e93ba684c145105d88

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp314-cp314-macosx_14_0_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.2.2-cp314-cp314-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 65c1bf2fe0620c597ac213ad398718e09fc4b2007d2390ad673cd1da2e46a1e0
MD5 f6d975fa2f44ebcbfa4334a5f413213d
BLAKE2b-256 39f10e83626a79f4bfea2b1ce937b48af39560f5bf2fe98178c5286e38384694

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bocpy-0.2.2-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2550097702252b72f6f3f7edcc018c6b29ba69629cdb0d7bff13c5afa46a4bc7
MD5 a73a083b225c69540cad336eee306757
BLAKE2b-256 965bb5d1e74ef2f6952ae3676b2362f931198b10c0f79c69853605e437313f03

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: bocpy-0.2.2-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 110.6 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.2.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 d57a4357686ee3c747c96e572a9786afc97602f7645d798eabdb31e2caabbb6e
MD5 d8504603df14b8a9d6ec9c89473cf79a
BLAKE2b-256 be8bf4bbfc8acba76dc3b63b0953a306a56c8bc24a928dc73d4a49609c482890

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp313-cp313-win32.whl.

File metadata

  • Download URL: bocpy-0.2.2-cp313-cp313-win32.whl
  • Upload date:
  • Size: 107.6 kB
  • Tags: CPython 3.13, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.2.2-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 6b8e9c5383ebfc420e5adc788651ccc74b68f1e3f40655d4e91ba197a7eb4a66
MD5 16a7d708b12b3665d18ee6a95f6969d6
BLAKE2b-256 fa493056363085e5804d9970c91d0ec6485274ff93b0cfff054e91240a11112a

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.2.2-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3de276a53903654c787096d76d56b442860684d596a7ff8c24c5a7f2aa3525a2
MD5 71a49a7e1cbccdb39f6b7d5e4540381d
BLAKE2b-256 5811fc401f8c178a4136175e8035c4e91535509d1ee33696b675b78e2db63cf4

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.2.2-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e455eadde9b58d389d611254403fead806529cee9b42eda68aed98aa4b5f197e
MD5 7de57e7dab8d6fd8e674ccf9743d68d6
BLAKE2b-256 29df4bdae5964dc07be8fccd5dea1afa6a50ad708e30a7f053df5a773cd962ee

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp313-cp313-macosx_14_0_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.2.2-cp313-cp313-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 2014380454f1f23716a14b024bd46a04e6b2180879ebc4c6125a5834693664ef
MD5 2fcb1fa39d477a8cfc23d66e8a09b6bf
BLAKE2b-256 f5a9bfa78f013427ecf572cd9d3dcac620a102c61553e2f27860df664836055a

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bocpy-0.2.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 172a4dc9c84f5b69d5d1c286cd6f85d1d0d233699fea9ea5ddfa79aa15b3b8b5
MD5 3d7f0aedbe912020355d07daea8ebb64
BLAKE2b-256 6039206a63c592914338bd6eba1411f781a8d57c75afaaea3ee6ae0eadcc3e5d

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: bocpy-0.2.2-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 110.7 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.2.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 15f62da7e93d05a59b15295213dde816b637a1aa2e34e4f68769da98c70154d3
MD5 87329beec5deb9d50368d84761e7b8be
BLAKE2b-256 6c61df96fd9cde70631cfcc9408bbb9b65163c188f9af40a79a49d9aa4e8b6f9

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp312-cp312-win32.whl.

File metadata

  • Download URL: bocpy-0.2.2-cp312-cp312-win32.whl
  • Upload date:
  • Size: 107.6 kB
  • Tags: CPython 3.12, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.2.2-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 80481cd3085cbd5af3d93bfef42b8a64785b2b347387bfa78d0d03c0ddaa60c7
MD5 4666c5aa98c65f54e22b6c32beefca24
BLAKE2b-256 e6e281bfe8b7fc54a5f8c8d3179c52764fa7f34597cf5410e480a7e29b491043

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.2.2-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 99e988eecfe82444dadca22304a34c2efa6c834d87e39c3a1bea14b2aa50ccef
MD5 630e39668671b223f4b3c75e7c48b5d5
BLAKE2b-256 aa05061fa08d0f9825c228c8313dbc62fc736600df6aa177ce5ab083ec22ea87

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.2.2-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 db0d10d528d99522f6a415b196fe31b3ca26cf77b62e1f4c511c4d6f330b437f
MD5 a821d5c5ce0cf170f0246492c52fd713
BLAKE2b-256 64b8becf6fbe14432473fa8265cf20c7f04a051ce89bce093ede658122bcc935

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp312-cp312-macosx_14_0_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.2.2-cp312-cp312-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 e1188d2e105f2d144c5689997b10b09f065a5ee95cf17e65ed6e0b50320ac2df
MD5 affe46ed59ef59b9d2a1cf22213fece0
BLAKE2b-256 389f624ffdd016622b8365b0f9a9a2729b0be9f38fc2e1fde30571c000f5c980

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bocpy-0.2.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fdf9cb63cd203c5abb98b8cae0c11a571ad54fee3b47bb2f11e8b228c22b8b05
MD5 e7df4b24e5d13d2d7857df3bd713b21b
BLAKE2b-256 4d3134cde42487bcec31d4e0c855b62460c4cf985214ac3a61eed5ab04fc6cef

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: bocpy-0.2.2-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 110.6 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.2.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 dd23e0ad881b27b371b9de6c0569e08e35c283e1ad558741c4b99c432c5e159d
MD5 c350bd2dced601e079d8772b82cd9f99
BLAKE2b-256 c8ff94e4653417e87c421bca47425d9e66e8f875d521ac5e2e315662be89eb80

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp311-cp311-win32.whl.

File metadata

  • Download URL: bocpy-0.2.2-cp311-cp311-win32.whl
  • Upload date:
  • Size: 107.6 kB
  • Tags: CPython 3.11, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.2.2-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 ad2aa43a7c9dc0fb1f9b098e642b089fd3adb18fafb6084fc8c27aaf7aa43643
MD5 2d44ac531b71cf5606657d808a1dccdf
BLAKE2b-256 f8917144f90505dfbb476d31e00cbadfc131344f4a3c5f1c9b7301c97cecdb3f

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.2.2-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 bcb1fbfac680b60abb1a92f16cb5ba1bd11f30d8bcb45b2a4fbb11ae18dc9826
MD5 29cdde70b94bcd158fc528fdfad1a9eb
BLAKE2b-256 c0b15ef5a961dd18ff032432a34f137efee737be15f41ae0aebe7bef8da14544

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.2.2-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ada734d17409010ec5d3fe30b06fe36fbd0e9c2cc1861f9e1240478175c6735e
MD5 3e0c3eb2e0b15225d5abcbd8ca558ccb
BLAKE2b-256 4a2856a5b3fc5f346e4937eec9950862b0a7faec8e6f35a4adfcd35c1a40a7e6

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp311-cp311-macosx_14_0_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.2.2-cp311-cp311-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 cc82b5243c8d8f156d3a83d96c43ee5fb85697ef1ce57ec4b4fed2961d7c57ab
MD5 42a68153bde617fa7c39dd1643eede60
BLAKE2b-256 a16915a5160b538e72ab04f1013a616dba8abad454a39fa74ea7b676343eb8d6

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bocpy-0.2.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8e5add4427d87c1c3cfe0b10a9ed569eb0c6242a8ec64a18946d2a29354e0513
MD5 1ca9f4cc232f0229c2d07198d31a8789
BLAKE2b-256 8baa148e64ac485a5328f603d4855829f473d0d6e2ee2989a3ffdc2a7b056d94

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: bocpy-0.2.2-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 110.7 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.2.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 b6dcee28c4f3f91128c87e73b065b2ee745f619d557321f40ce38caef557c6c4
MD5 8af20b60abdf9c920f8137603ce030da
BLAKE2b-256 917225722cd2b2295b1fe1ca9388e55ca99c29b45cd29c03b710c6f448b96f44

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp310-cp310-win32.whl.

File metadata

  • Download URL: bocpy-0.2.2-cp310-cp310-win32.whl
  • Upload date:
  • Size: 107.7 kB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for bocpy-0.2.2-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 ecb93ca042a65fa79b30d79930126233e7977ad089fba5aecaa52f3480855e32
MD5 fa2b6489cc002cff7ac50cee2ac89f5a
BLAKE2b-256 d7c71384d020b8e24cb574c2ec12dc646d597fa162bbd2bc617391c1f32561f8

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.2.2-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 35a6997d247e43c525d47f5893e612bcfbe85b7829d0d6d3a0c5e071c947e68e
MD5 3727158d3dd442e0e236fa8c371c0fb3
BLAKE2b-256 24b2b3abd46d8c10ce4f7612859a7c91575efc9b047e3b8567e6c0a2062a1973

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.2.2-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 85c4a78841b116bc0068015aeb70d9d80f7eb0326b4bf4b7b91ca4f8018e5f6e
MD5 58f848da0e636b925f9477d46c37eead
BLAKE2b-256 12308e2e4c37ddd12edf998ea00567b6088264f8e7dd1da625702170c32993f1

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp310-cp310-macosx_14_0_x86_64.whl.

File metadata

File hashes

Hashes for bocpy-0.2.2-cp310-cp310-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 969e5b40c369def40e245afddd36655ba0bfd7dfc0cf1b6bbcee89a1450dc427
MD5 a61525b84f2755f0b56aee560539b3b5
BLAKE2b-256 42356ffa74594512ef4fe8a6c6b75a22c0b69821aa8ae25d8c95c09f2e28f49e

See more details on using hashes here.

File details

Details for the file bocpy-0.2.2-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for bocpy-0.2.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 66b8dc2981bf0692027c792723c2cf621df5fe04a4a62e1e425f4801b46b1dbd
MD5 f2132a101bdc1b23e37b317c12e44897
BLAKE2b-256 47138639c8818a14fea9f7b418c7d7411e0f169ea3a786c540d32c3659490aa6

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