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.3.1.tar.gz (95.5 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.3.1-cp314-cp314-win_amd64.whl (117.5 kB view details)

Uploaded CPython 3.14Windows x86-64

bocpy-0.3.1-cp314-cp314-win32.whl (114.6 kB view details)

Uploaded CPython 3.14Windows x86

bocpy-0.3.1-cp314-cp314-musllinux_1_2_x86_64.whl (288.8 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

bocpy-0.3.1-cp314-cp314-manylinux_2_28_x86_64.whl (291.3 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

bocpy-0.3.1-cp314-cp314-macosx_14_0_x86_64.whl (120.7 kB view details)

Uploaded CPython 3.14macOS 14.0+ x86-64

bocpy-0.3.1-cp314-cp314-macosx_11_0_arm64.whl (116.2 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

bocpy-0.3.1-cp313-cp313-win_amd64.whl (116.2 kB view details)

Uploaded CPython 3.13Windows x86-64

bocpy-0.3.1-cp313-cp313-win32.whl (113.3 kB view details)

Uploaded CPython 3.13Windows x86

bocpy-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl (288.5 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

bocpy-0.3.1-cp313-cp313-manylinux_2_28_x86_64.whl (291.0 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

bocpy-0.3.1-cp313-cp313-macosx_14_0_x86_64.whl (120.9 kB view details)

Uploaded CPython 3.13macOS 14.0+ x86-64

bocpy-0.3.1-cp313-cp313-macosx_11_0_arm64.whl (116.2 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

bocpy-0.3.1-cp312-cp312-win_amd64.whl (116.2 kB view details)

Uploaded CPython 3.12Windows x86-64

bocpy-0.3.1-cp312-cp312-win32.whl (113.2 kB view details)

Uploaded CPython 3.12Windows x86

bocpy-0.3.1-cp312-cp312-musllinux_1_2_x86_64.whl (288.3 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

bocpy-0.3.1-cp312-cp312-manylinux_2_28_x86_64.whl (291.0 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

bocpy-0.3.1-cp312-cp312-macosx_14_0_x86_64.whl (121.0 kB view details)

Uploaded CPython 3.12macOS 14.0+ x86-64

bocpy-0.3.1-cp312-cp312-macosx_11_0_arm64.whl (116.4 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

bocpy-0.3.1-cp311-cp311-win_amd64.whl (116.0 kB view details)

Uploaded CPython 3.11Windows x86-64

bocpy-0.3.1-cp311-cp311-win32.whl (113.2 kB view details)

Uploaded CPython 3.11Windows x86

bocpy-0.3.1-cp311-cp311-musllinux_1_2_x86_64.whl (285.2 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

bocpy-0.3.1-cp311-cp311-manylinux_2_28_x86_64.whl (287.3 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

bocpy-0.3.1-cp311-cp311-macosx_14_0_x86_64.whl (121.0 kB view details)

Uploaded CPython 3.11macOS 14.0+ x86-64

bocpy-0.3.1-cp311-cp311-macosx_11_0_arm64.whl (116.6 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

bocpy-0.3.1-cp310-cp310-win_amd64.whl (116.2 kB view details)

Uploaded CPython 3.10Windows x86-64

bocpy-0.3.1-cp310-cp310-win32.whl (113.2 kB view details)

Uploaded CPython 3.10Windows x86

bocpy-0.3.1-cp310-cp310-musllinux_1_2_x86_64.whl (274.1 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

bocpy-0.3.1-cp310-cp310-manylinux_2_28_x86_64.whl (277.8 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

bocpy-0.3.1-cp310-cp310-macosx_14_0_x86_64.whl (121.2 kB view details)

Uploaded CPython 3.10macOS 14.0+ x86-64

bocpy-0.3.1-cp310-cp310-macosx_11_0_arm64.whl (116.8 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for bocpy-0.3.1.tar.gz
Algorithm Hash digest
SHA256 019b85090bae8aa7fd1d6a61f7af28ad2d4e119f68f46124a7ac335d1ac9ccc5
MD5 0fa1035bd5c72358c56160dd6b14297f
BLAKE2b-256 7e0dfad361e857c7528b7a06db8fd246df2b708d3639ffee074e3b2ec57bc0bf

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.3.1-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 117.5 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.3.1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 06ff9dcdf2e8065ab09381fb9e9dc243445e3e7bc0f9bed3c477076bc02e5cb2
MD5 db89c8c83b6679a3d62d046c52952062
BLAKE2b-256 15139f1e7cfc4c6705f5a4894ef63db6316b3bbf0475071e9bbd1387bf0ea7e0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.3.1-cp314-cp314-win32.whl
  • Upload date:
  • Size: 114.6 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.3.1-cp314-cp314-win32.whl
Algorithm Hash digest
SHA256 62fb9875ae7ec1c55bf12e4e448c77c36657188804092b618e04fe82ce78af00
MD5 cdbb5c5ac5aafd0f28a3e8545f7384a6
BLAKE2b-256 e53caa56c9c6057d15db856e346c04d0e637073f4e16def38a1ad1d693dd1c25

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.1-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 fe72a296a7cbd993b86ff08d6de820fce8f5ff526e353636cca3cacf82dc02b5
MD5 2e360d539011d1cc91adb96ab20dd724
BLAKE2b-256 e57252e044d7b9cf0de9defd5fcab3b87bda730821d72fb44c0b98c7d73a1457

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.1-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 10211cf991e1f19c6e96fc3ea9ac0df0171b57821895ad13b6c6ca286fc0e9f9
MD5 093325c39bb6a4103893140a5864904a
BLAKE2b-256 e5fa909a69b8ef1a5d0d67c45b2e5820d41af1ff3dbf721a9459e823282d356d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.1-cp314-cp314-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 0dbe6c82684f030b3c74327a5412deda35a57d9bf801ca0a1bb397e04b8d834a
MD5 3c3f717f0499abd4dea9dcb59ec4727a
BLAKE2b-256 acb9aca596adc220d867c5a0650b36b41f6ac06ae311d1d9db997251fd140b6c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.1-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 82b6fc3daf2adcbcf049c9676bae7be71faa502473ae346c485c99e2ae96ede4
MD5 d36d7fee099bef5dc046065a32d66867
BLAKE2b-256 6c3d97afbd48ea7283bdc2cd1486c04d9636b4e59f9d4ed5c8b2cc8e6481fe31

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.3.1-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 116.2 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.3.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 294fe04bab037bd87c4f49fb6927b16fb6fd3c6e5352bc3b492c347a68ea5154
MD5 b907d0d410bb8a030a6d2ac139075d8b
BLAKE2b-256 c8cbe0438f082beea7e7721914ebac02d8b6067c57c0aee5f9dfa704ff38b306

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.3.1-cp313-cp313-win32.whl
  • Upload date:
  • Size: 113.3 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.3.1-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 1c5bfb4d58c5fa20ea4ad91c1228d97e138d794867cf39ba3952eb896d810175
MD5 be8b0b277ca9f5c0c7c7f0a45cf56596
BLAKE2b-256 7f1a1f6d97be57d0fc94207ce17e35ab6d263584cd1c701603d59e2c2b03660e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 20cb737626ba9a51e14a7247890ea9281604c780eb1f23ba5f8ee341d90e6148
MD5 1a4faf252c793e648daea68482f99b1b
BLAKE2b-256 4a29604bd3cf9ecb64c2b350b3f323477d4083f57e98a248cbef84030ea19423

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.1-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7f2670030d14d9fc912104a57553075601f618b39b049eeb325b9a884e048ca9
MD5 7f726aa2739b54ad42e367b3c1e2568c
BLAKE2b-256 270a661775d6059fc8a7a5d30111805ccd9456dda2664494d9ce2322f3e581bc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.1-cp313-cp313-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 7895a0a220cac882e036e816d9ea32a5758491a09a04f151cc7778afa1935ab8
MD5 82a2a99bbbdd65bac9c0846cfd61bc57
BLAKE2b-256 11498c26eaff51d6b5f5f5d1d7eb8007e738e9265868c06171d9578f8422ac30

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ac98dba493e1b4d30a9efc4b9128ebadb7dda16cd04125cb685e6c971291f25f
MD5 855f635a1a48ca9fff260412f0815f2b
BLAKE2b-256 52906ac44670af38a91692a098ef3b14efbe861cf515cf4d88f19d65ac80b7d5

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.3.1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 116.2 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.3.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 d32e377ca12b70f41d31e6ce8335364dfe6442477ff2652df3ff35176e90c4de
MD5 0c71fe3aad6ab95a74add006af171aac
BLAKE2b-256 e7ff04fe4675d4c8568a35f6f71d8e48095681ec9cfd67b5257918b1447dfb4d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.3.1-cp312-cp312-win32.whl
  • Upload date:
  • Size: 113.2 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.3.1-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 be6f4d849bf30fbaf02c9d6fc643c3a92184af5a13d5926c0f2808321da7a5ee
MD5 982714b4796f9914df6e6000ee09eaf8
BLAKE2b-256 3b50347d39ab1852598e5d51b885deffef00e4d4d1623526e0abc6992cab471a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.1-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c60d70dc0ffdb02cb0e007460be7106f76934244cbfb987523d60b2195aba4a5
MD5 f1cd1da1429658f2fcbb0bdc89d096fa
BLAKE2b-256 6d7e35616dec53e77db63773cbe9728f6527a0b133b1be9b0331820bb06000fd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.1-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ac9bf646d19bceb0ef6b28e0a7080b005fbaf4dd174af9119e46c62528b02d52
MD5 39e2059a99e60185b4f51be0184ce182
BLAKE2b-256 1441dc44b2640b007faff13a1ba7e1ad5a5b2dfb216718b4c193d5306eb2d465

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.1-cp312-cp312-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 b8dee7ec1a1d32bc6145e2c8c2be2e3ba441122b4b407af39837eecfdb8d2224
MD5 8d496694e85973e1422ba1a2403a3b9f
BLAKE2b-256 c8b3782ea0cdbc20da16c1a433ac85032a60aae3ed72ce33b3db062b754504c4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fdcc049783df06a16fd9b2584251c9787be89d965bd43b8f0c53de87164dd50d
MD5 3901ef55a662b0ca6a84b2ef9e6cba7e
BLAKE2b-256 2e23f569561b6e15ded9c7145290d62f45ac236a57e2cc8529023636a2a5aaab

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.3.1-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 116.0 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.3.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 2faf54723d7a4d3fa5232eaf124f0b71ff335f797c445e5e44546b096f00122c
MD5 768509bedc24cce66c17bb416ceba31d
BLAKE2b-256 4c6c83b6bd16bf16571d1dbcdf58ca9c8a8822cf123973090cb598a412c5aa94

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.3.1-cp311-cp311-win32.whl
  • Upload date:
  • Size: 113.2 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.3.1-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 8b0daa75a43bf7ac927e26ab85951e79455daec67475d73f82f2b4e4b2292d71
MD5 9daec1ffed904cb349deb7575b1c6893
BLAKE2b-256 6fb9527ee94041991707483e24541d163ea2e4481fd9e833112d572a55b0c5b0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.1-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 73ebb860c37f6eeaad484c43b9869e6a81f19c989043add191baa95979aeeccb
MD5 61010be1d75a37fb8c5c4de44883273c
BLAKE2b-256 c90500557c10b8d47df17039de46ea9c6b8ef6ce9c2158d0cc002609e93614af

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.1-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 78d20166c5b870e26dcf3f14da74661f10e1de9cb84e102673adc8e0dc45d2da
MD5 bfe072bfb0e693738c36c048f491af3a
BLAKE2b-256 2d8c9f03e23c5009e5db801d8c47bb63430a605636783c8ce3f1ca8824785219

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.1-cp311-cp311-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 3978b64ad9572a939f9806c49d6dee45f54a1f2a801de639c5e959341d20c021
MD5 9175d6a3372eaa08067426bad761de9f
BLAKE2b-256 7e190ff0ae0f9dfcce6f5b29646fb43cc6b8cffe7d9156da7f13d171baf68d67

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 09c0c342d30e0ba390d0482a5f48e05dffb0a8b9fb5b3c1239cb2dcacaf77f5d
MD5 17d48460bb6d29d57998ecf001146744
BLAKE2b-256 9279328ed4245d1935952c528efa5267bc04cf327e56ec90a2e8145d0012bf56

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.3.1-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 116.2 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.3.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 9d335ebd9f4905d57828fd435a2f24a6e64880b576b2bf948900f6d072e9a7e5
MD5 2a1c12804d14e780f9c849c6428c673e
BLAKE2b-256 3d463b6c0718e9e2a424a7a52e690acd8aa7658a07339203b9a595d7ce03e28d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.3.1-cp310-cp310-win32.whl
  • Upload date:
  • Size: 113.2 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.3.1-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 5d779bbab2f85b4087c493fc9219291162b60b205c4236c404273b6d77f68a21
MD5 143bcf541feb0eb78847654b4c4185b2
BLAKE2b-256 55679942e8e1c60353c4a113d752c6a57fe7bb0d1b5868614c726f744752be86

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.1-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 21c325b4013874df688b10adc9a0894dfa00176898280cd75bbc249313b01f9a
MD5 24b783203dad6b70c5d07b21cd220b9a
BLAKE2b-256 5e58ef6e4f8a0e3034ebb105ea7640376658b2256e02f266eb175f3b5257c7c3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.1-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 265158fcd68bebe8c1eb39cf24b4f2815a4ee3166733850154c9f54ea8b6084e
MD5 9e685cbb5b6f51a5ecab9487b261bba6
BLAKE2b-256 1bad6e4c0dc198083127f3905c1470c9610f514159296fdc6efdc4ae0712ce89

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.1-cp310-cp310-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 7e0e8f6eaedebe1edbfb5fcb8f357ceca78804c4e4b5917ff4e982f111704f4d
MD5 ca5fce2ddd1b1395d273f34f2204e146
BLAKE2b-256 2b679d0b1cc9afa5b26a38174bf3a8bc1056bc077a003758793bb4319ea2b51b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0af43d2398af2c5ad962ad85f431fad352cc3745ccf4085f4cbc3a1d741309e1
MD5 1c1d436cdaf4953888279905b3c645d1
BLAKE2b-256 2b50a8f034ad484db086a207a0de7d1780f980e56e8e2b27cc5a810c100dc3ab

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