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.0.tar.gz (94.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.0-cp314-cp314-win_amd64.whl (116.4 kB view details)

Uploaded CPython 3.14Windows x86-64

bocpy-0.3.0-cp314-cp314-win32.whl (113.6 kB view details)

Uploaded CPython 3.14Windows x86

bocpy-0.3.0-cp314-cp314-musllinux_1_2_x86_64.whl (281.4 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

bocpy-0.3.0-cp314-cp314-manylinux_2_28_x86_64.whl (284.5 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

bocpy-0.3.0-cp314-cp314-macosx_14_0_x86_64.whl (119.5 kB view details)

Uploaded CPython 3.14macOS 14.0+ x86-64

bocpy-0.3.0-cp314-cp314-macosx_11_0_arm64.whl (115.0 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

bocpy-0.3.0-cp313-cp313-win_amd64.whl (115.1 kB view details)

Uploaded CPython 3.13Windows x86-64

bocpy-0.3.0-cp313-cp313-win32.whl (112.1 kB view details)

Uploaded CPython 3.13Windows x86

bocpy-0.3.0-cp313-cp313-musllinux_1_2_x86_64.whl (281.1 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

bocpy-0.3.0-cp313-cp313-manylinux_2_28_x86_64.whl (284.2 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

bocpy-0.3.0-cp313-cp313-macosx_14_0_x86_64.whl (119.7 kB view details)

Uploaded CPython 3.13macOS 14.0+ x86-64

bocpy-0.3.0-cp313-cp313-macosx_11_0_arm64.whl (114.9 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

bocpy-0.3.0-cp312-cp312-win_amd64.whl (115.1 kB view details)

Uploaded CPython 3.12Windows x86-64

bocpy-0.3.0-cp312-cp312-win32.whl (112.1 kB view details)

Uploaded CPython 3.12Windows x86

bocpy-0.3.0-cp312-cp312-musllinux_1_2_x86_64.whl (280.9 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

bocpy-0.3.0-cp312-cp312-manylinux_2_28_x86_64.whl (284.1 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

bocpy-0.3.0-cp312-cp312-macosx_14_0_x86_64.whl (119.8 kB view details)

Uploaded CPython 3.12macOS 14.0+ x86-64

bocpy-0.3.0-cp312-cp312-macosx_11_0_arm64.whl (115.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

bocpy-0.3.0-cp311-cp311-win_amd64.whl (115.0 kB view details)

Uploaded CPython 3.11Windows x86-64

bocpy-0.3.0-cp311-cp311-win32.whl (112.1 kB view details)

Uploaded CPython 3.11Windows x86

bocpy-0.3.0-cp311-cp311-musllinux_1_2_x86_64.whl (278.6 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

bocpy-0.3.0-cp311-cp311-manylinux_2_28_x86_64.whl (281.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

bocpy-0.3.0-cp311-cp311-macosx_14_0_x86_64.whl (119.8 kB view details)

Uploaded CPython 3.11macOS 14.0+ x86-64

bocpy-0.3.0-cp311-cp311-macosx_11_0_arm64.whl (115.2 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

bocpy-0.3.0-cp310-cp310-win_amd64.whl (115.1 kB view details)

Uploaded CPython 3.10Windows x86-64

bocpy-0.3.0-cp310-cp310-win32.whl (112.1 kB view details)

Uploaded CPython 3.10Windows x86

bocpy-0.3.0-cp310-cp310-musllinux_1_2_x86_64.whl (269.6 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

bocpy-0.3.0-cp310-cp310-manylinux_2_28_x86_64.whl (273.2 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

bocpy-0.3.0-cp310-cp310-macosx_14_0_x86_64.whl (119.9 kB view details)

Uploaded CPython 3.10macOS 14.0+ x86-64

bocpy-0.3.0-cp310-cp310-macosx_11_0_arm64.whl (115.4 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: bocpy-0.3.0.tar.gz
  • Upload date:
  • Size: 94.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.0.tar.gz
Algorithm Hash digest
SHA256 4bb4c9ddb757616e05cda2f9cb7830372a4831938d18c902c545a43db610f677
MD5 4a11fd04a987dece4131adbc6939f317
BLAKE2b-256 096b0040d5165f1becd08834c8f44022e158fc5118fe9fa8b6afe434aa250f84

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.3.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 116.4 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.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 db17ee574991524586dfd60eabe3003b3588387bde5918524f65f7783f1cf1f8
MD5 ebcff1ac08e056533dad9bfab94d2a23
BLAKE2b-256 5895040ab464e3b23eb840455fc168f2933a051f46ff34947d0f3703057311ba

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.3.0-cp314-cp314-win32.whl
  • Upload date:
  • Size: 113.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.0-cp314-cp314-win32.whl
Algorithm Hash digest
SHA256 cbcc58d2ed81a5e8c49dacc658017952eb3dfbb675cc08bbe25ae117df05adc2
MD5 f70aa96089984b2ebe9e12cafa748b7b
BLAKE2b-256 321b7b8f993da32ad0970215bad3efbdd1d83520b5aef0fda45784fc8fbe2efa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.0-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0dbabebbee09788f8384e39d00e9ecb8cb23e3577f0153f3cc69c3dda850e876
MD5 cf4b2636dcd58d60d7e608ba9848ed6b
BLAKE2b-256 40da9319d97e8502c67d3519374f838016d0238796794b03b0ca544a5776359d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.0-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2265aa85b78f4146b3e485ceb8964a0bfe4b43a590359605d3bd4121d1baa14a
MD5 7e8ba11a7ffb371529e6794dae4061e8
BLAKE2b-256 778c2b2232c5542449ab89bd9cfbd8fb56a1585d2cfe3bcb359618bff8fe5885

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.0-cp314-cp314-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 7d8b10969719fde22b509a1c7f1f31c30da997b11f90761ffd4172edf1d6f19b
MD5 88b045acb1f1cec4869f2d236b5ff827
BLAKE2b-256 07743e26a0572545b7b1940c03d3fec56cd690d3f7821e148e57a5ce66a83abf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 36fe26684764be24f90afb3d87ca92754cf1deeb8e3fc4e8f13f8e9177c81e38
MD5 9c9960b685eac4c7c1d964286237a3a9
BLAKE2b-256 5872f8960251aa82b0cc2de364f9c7859e83eea888c29ae4bd92e8fd11046d4c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.3.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 115.1 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.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 739cd3652d4097d65de16ce9c3dc8dbf02b993343b1c15a0d81f46a3c777676c
MD5 d5584a66fff4e8d7973d24d65b168cef
BLAKE2b-256 0df93c5c8fa9b8b580de5658268578b5d71610293f2c73111d7f331ee869a516

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.3.0-cp313-cp313-win32.whl
  • Upload date:
  • Size: 112.1 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.0-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 75ccb757d0b4817a46d95bbb343b63a48b1a3ccac636df890cfd3924adcdc99a
MD5 b89a8df52e20cae07fa9188e373fd7b5
BLAKE2b-256 d1194c67476e4d81012ad43c1107881f07372fe7d287f72ab96abb470d6abff4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 f064cf1f2e726f302ef4ce917321055df94a1f826d283dd404a513a2f9f1fe5c
MD5 95d8c191b4d6abf3a3822f877d3573d3
BLAKE2b-256 925d86e7aad431aee22076f549fb4f4b375ea0f1c396c88865dab1f37b120c3d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.0-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 67038c6c1f73d459290651502df36b7f5c34ab941d81a09d99b44970ad1889e8
MD5 a9d1834494e52b55146cefaadecdf0c2
BLAKE2b-256 398dbf3a4ea662e4f7cbfba585bb05998f7194999928baccddb8cd132916e81e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.0-cp313-cp313-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 c7fe96b3be10e93c2e24ce31247f334f9c4f64ee044dd5b960b875267ed345a3
MD5 45459dc24e043301ef90b2e01bb5de48
BLAKE2b-256 deb727044df7f8489c6aad0a3e11139fab5a89886391d1adf8aca383a161e2dc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ffccec5b9a3bd6551fbbcfa9f3f6486db50b4f109859102957dadab605535793
MD5 09a8d1b44bbcab1754c3c12f72649a5f
BLAKE2b-256 752ffcf6d52aaa3a1b18863d746cef5d5763ec594b312173cc34cf302dbf5470

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.3.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 115.1 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.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 d38a4f0d68b45909f9d49dfa01445e3264002064d955d7222efcae60c4b6654f
MD5 febd0c0599a2c1041678e3044730899c
BLAKE2b-256 b12e54bcc93dc54b862aa582735f02aa3f6462a1b920dc68c0efb69bb78f63fe

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.3.0-cp312-cp312-win32.whl
  • Upload date:
  • Size: 112.1 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.0-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 87da5f3194295dc94e6d1aac47219ccf9503d888d09f887b2b5a50a6c47e5326
MD5 6576b3d2aabb36e702962b160269c8fd
BLAKE2b-256 ee087bd47f17fdbd1ebd28271d595b80ad0edc7c04badef9f27b6e7e8f1e1fd6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6cbd8c0d7fa4c7d19766718785dc2e764624218375774f4832d84334d899ce50
MD5 340ec115699a6f3b952910b269d12497
BLAKE2b-256 bd8031bdd46d7727e1840394b557572ff61efc34f6670ddeb8461c95239eb904

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.0-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3826375189b82a99798ead9394f34f8350deb601ab28e117ff2c6a776a93cac8
MD5 d9e1fd5e70bd8ff629a4c50dbe218146
BLAKE2b-256 e0d25982623a3ab527666865a000712d5d398b1c99c360abb60360044010864f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.0-cp312-cp312-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 bb358680a06c5d2e1716f2a7cecfed213d16b5b07b8685f9622f1c0cd24d43bd
MD5 3a60a5b6a22c3902b58db075b632f2dc
BLAKE2b-256 94c91e169d30ac7f6ea29a919868a17a187724a7e39bf1abc33183535bb21f2f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 86a77ca2b963b5d02ee72286beae891c5e5b4cfca6681247cb4c0f78033f6a97
MD5 6b651e4e1976b0512ab5e7314e353205
BLAKE2b-256 6dbc095bdc7c8bd8c20e91ac33960c6bd8cff06376e1ed612c53f87a14e9572d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.3.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 115.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.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 9b7cfb27b655baabe92ae836b1138c6b192ab9aaf9732fbc07235f43b831cbbb
MD5 8abc38202c33bd4ae8f3bfbc1f4a928d
BLAKE2b-256 e6f9efa4e5f08402c237e8c936cec44f7ffd1f21b94b71c871dbe574a2c24e86

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.3.0-cp311-cp311-win32.whl
  • Upload date:
  • Size: 112.1 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.0-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 fc83053d2dee3f89cc557fcd718bbf5101b927852f331a1dbb30d86b3d90b6b5
MD5 21a68ca27c3c2b45e947dd56767916cb
BLAKE2b-256 5c1cda0c844854b956603096d6f61fa119bba21d429c9db7ce08469e59186504

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 5ed532419bf493a14b4b5e125b0b71bf299f59838f8bd18aefcaf8fa931f2e54
MD5 8c054f1e7d07e323f5b1bb4fa505612f
BLAKE2b-256 3ecedf791300dafb2a3781930b7ab5b240bca7b01cd94e1442d73811efab0f0c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.0-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fd1c6fd4e77eec5a3bb15c7a71b25a4bbd127916c6894b8263a6ab3bd67e228c
MD5 593ff075c84696f1401c4bc18db8a193
BLAKE2b-256 7e038ca7335adeba6bf5979a65df5eedd8ca099a515a12dcf99c13507e872be0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.0-cp311-cp311-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 6817c4a0543cff11f9918aaf0f4b58ea3429d0b39463584d3b2fe5cbfae86cb4
MD5 9ad9ae88afb1e2962d55214011bdd11a
BLAKE2b-256 a7c9e5023405424544e749bd4c62c5b2853e1e572ba4d151a1a3f1b94d8919ef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6ee569149cae654224ea515363de5f75dcaeea2c1abd9445829f82435a919f4f
MD5 25ffbf8ca0f69bcb36b72c0dd8bbc565
BLAKE2b-256 1b4fdad146ea5b03f8518473dd1f0a2894dff69ae59e293f0b89ac751977414f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.3.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 115.1 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.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 7e319001f343be26a39eec9984046d6be06f5466eac124e80b0310bc67a2be80
MD5 aaaf5c5f9a13254107c0dfb501b95da3
BLAKE2b-256 23c6f794f3501d36b4cc0d8400e1ef9bf1b7bd005a967f912b68e956598540e9

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.3.0-cp310-cp310-win32.whl
  • Upload date:
  • Size: 112.1 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.0-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 d12c644f9d7ba7a5e103af3fa8f40e0dfb12ccd9349bb8d5ca2cfd605aae7e0a
MD5 f0c392ba229273973e4be70ab15c9da3
BLAKE2b-256 2145457f270d2881c6453d2fd6ce604185adc8d085cb54d146a853157ee19ffa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 1b838393d865f712bd08c0082bb43059346c0d57362b571e14589b3e54b52de5
MD5 dc3a7cd65df566c7e00e6e3047bb8106
BLAKE2b-256 14cc73b8dd52dac5fa791f38899d35a772e06b7a664b534a5494def198819100

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.0-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7ea9a172d0aa2287685a68a27e58ff7af9b951f19ebbfbf641a40e71cd0b74ca
MD5 c4a2cea634b43d8240acb23566e0dfb5
BLAKE2b-256 2ae4205dfbdfe793a6df7265577759ee00c0c4c7af7c5705465b21a0f6d6bc53

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.0-cp310-cp310-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 500113c7c077307d4dd3f68ae368090fff84f384608e2c6fe9c5035860adb8a6
MD5 790332aed858bdf19f43cdbd5f38a3b0
BLAKE2b-256 29b614e8af2eff54fe4b543a4693c3fd7bb85d34020ab51808fa475d1a1434ec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.3.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1a04aa62de5c0fa20159cd97d2826fee478c5721c9728d1cfc0dd0867f91bc35
MD5 a157fc8f6357c737a6fc3c5bf9b1f0dc
BLAKE2b-256 013ae0a580c813f9df28f88d5cde817500491559d74cb4bdf5230a9af1f2819e

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