Skip to main content

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

Reason this release was yanked:

Contains a memory leak

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.1.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.1-cp314-cp314-win_amd64.whl (111.9 kB view details)

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.14Windows x86

bocpy-0.2.1-cp314-cp314-musllinux_1_2_x86_64.whl (270.3 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

bocpy-0.2.1-cp314-cp314-manylinux_2_28_x86_64.whl (273.2 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

bocpy-0.2.1-cp314-cp314-macosx_14_0_x86_64.whl (114.2 kB view details)

Uploaded CPython 3.14macOS 14.0+ x86-64

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

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13Windows x86

bocpy-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl (269.9 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

bocpy-0.2.1-cp313-cp313-manylinux_2_28_x86_64.whl (272.9 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

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

Uploaded CPython 3.13macOS 14.0+ x86-64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12Windows x86

bocpy-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl (269.9 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

bocpy-0.2.1-cp312-cp312-manylinux_2_28_x86_64.whl (272.9 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

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

Uploaded CPython 3.12macOS 14.0+ x86-64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

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

Uploaded CPython 3.11Windows x86

bocpy-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl (267.9 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

bocpy-0.2.1-cp311-cp311-manylinux_2_28_x86_64.whl (270.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

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

Uploaded CPython 3.11macOS 14.0+ x86-64

bocpy-0.2.1-cp311-cp311-macosx_11_0_arm64.whl (110.1 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

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

Uploaded CPython 3.10Windows x86-64

bocpy-0.2.1-cp310-cp310-win32.whl (107.6 kB view details)

Uploaded CPython 3.10Windows x86

bocpy-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl (259.2 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

bocpy-0.2.1-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.1-cp310-cp310-macosx_14_0_x86_64.whl (114.7 kB view details)

Uploaded CPython 3.10macOS 14.0+ x86-64

bocpy-0.2.1-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.1.tar.gz.

File metadata

  • Download URL: bocpy-0.2.1.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.1.tar.gz
Algorithm Hash digest
SHA256 36b8cc09ba5b00c629e8a0424d004ea2f70607d2a97fa8a84a49a7cfadc652ff
MD5 c64b3d893957b7bf8288b1af828136e5
BLAKE2b-256 b2e5a2f8558424a77278abf0886ed3f225827f4330c6a15b08e99e15f2a866b0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.2.1-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 111.9 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.1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 b123eff5b0ec7babea1ee039aced2b63a8d43c4a7e3dc5e018ab40f0b9253eaa
MD5 0da3c90f524cd246c8926ec8ce2ef3e0
BLAKE2b-256 156ed6e257e043a12e7cce3cf13ecb4e7b5d8a4a8dee6deb9f14e7cf483f04a0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.2.1-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.1-cp314-cp314-win32.whl
Algorithm Hash digest
SHA256 fc80dea988d68fa89409a658105dfe87abcaeb7669465f1476cc322f9b6c0302
MD5 1cac8e9354ff9730e5ff8c6872a2de20
BLAKE2b-256 4d3ae2503aaea98f7b9badd0e3d67dd482e4990fa424488ddd313c2229a52672

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.2.1-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e97805f204e8a72359a94ddb3da8254723b92e79b2c7cd5e649dde43b3610b66
MD5 f23cb3c9d35ace853f969087653ebe77
BLAKE2b-256 a1f3751ff7312d93af121b72f04583ed968ea9e9a7f4c20d9845a30df8ef19e2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.2.1-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 cd3a61beed5e3c21a719a38c08f0267db9fc16d96795def7c513ae8e7a7311d2
MD5 cf63bfdd9464f7bfd519ec246eb34c66
BLAKE2b-256 e0c2371427c7f642a486dd3a4d14e69ab8acadd305cc3c3de18a8a4968d7bf5f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.2.1-cp314-cp314-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 0f90208a9701e31253bbe09bbfb1c4aa53f90fbe6d446d70dd7f5131c8232f23
MD5 e1eae9e0c197eaa52cd34d320a52c8b6
BLAKE2b-256 60690f569dd1119e01a7155fe2ec7bb11ec383ad387df0f6049ef9885f3610b1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.2.1-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6da6250a6202eb5c14c71c758ca709f605854519cc0f38aa0727eee97c6e2ee5
MD5 68e98b0ffa88d8315debc59fcb17ebb4
BLAKE2b-256 be7653e14f0a00f37a49e4691e9e251f26c0172df6909313b27d54bac2b2e558

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.2.1-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.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 9f5e545f40a409b899c9e3075166c5fd1bc5dba582aac94d951a6060f2aa1a1a
MD5 34744713a10ba8c14b61a96934af8b84
BLAKE2b-256 702f4a0a3a23ae7b9fa78c9a509c89aadf03488b731ca4edbb51b3e93777ecd0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.2.1-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.1-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 36afd8eb3f908787d2757e47b86a976d6f51f16def3fcf4423c5cdbadf9c7cc7
MD5 12639250fbcd4dcef8033c0864edfc15
BLAKE2b-256 861ea29cba71529897dfbfe2915b5db5a93f4d404bfc782aace4e3e472a2fa9b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 060e038bd7e74f294d88c40aea341e4f363be0c8abb2257691731d654c83cba0
MD5 be1276075d2c3d364aaf5277d9ad5a6a
BLAKE2b-256 1f910ba14e9fb9b4c3f2bee621906eb67f699f8dadd1290cd8158f5932498cbe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.2.1-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c8a6e45f0bc51a36ac7703a9cce728583217fd994b0108d45124574dae8b9f69
MD5 043b1dbafa0cc3ded443935f2360c9f7
BLAKE2b-256 ac5a827448c0213b14aced4bb8e1fd4417381c3f0e0ef66c6403f78236f662d7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.2.1-cp313-cp313-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 82e2b6336f03216cc35a23ad523664858fdeff8b805f1c6a35a051505d1e9b0f
MD5 d23e75dc07f298841b2ed8f9efac5a88
BLAKE2b-256 4bdb79fba0f961ae20b88de3a74fc2bbeeefc18c2b22154b5981352af517826a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.2.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 40a4e7a9e61f5568fbcd0a095e87aee3693fcb69e8ca9918e370304a8520e922
MD5 3fffdbe7d9cf4a8fb0f69175a2c9a4fb
BLAKE2b-256 af77697da029fe6db0ad0708cb78244beb97396e9a5e01d2d33e9cc9e3b9a65f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.2.1-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.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 beaaf5e0c1b7d7c69d6c35591c86fb979efdb7a9ac558c70a7ffa76618a9b43b
MD5 ee6290be16fa974e6ef0824d45d24801
BLAKE2b-256 813e0e8bb5de6c32b104cb562a8f3c965be3b5b2ca96b12a67e4ceae87ebd6a2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.2.1-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.1-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 94fa69628454b686c5aae1f38a4a23a9dc0eedd8aabaa259778a7319bd186dd2
MD5 b5885b1994a0f81cba7a4145c74ddadd
BLAKE2b-256 a9137635f00279a255a5e897c0248fdcc514b9178d2d5fb64b097655c2c84ed2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ab6cc7c2bcbc2454e853bc51f24a7c8fb212a6dd17c3fed3d2a2223e99e82280
MD5 fcaf94481bdee2e75681f7fcb224abb6
BLAKE2b-256 efc5cf2048726bdef4f45e0fb523e0788e30b9156ee794796e66cb0da2884d2c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.2.1-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3700101b896d2c0e889b5bdcd71847157bff232075f4d58762dad575615da2e7
MD5 e280e23a8cd625ffd6f36fb3906e1a8e
BLAKE2b-256 943e14b3ba1770c8438c045f46dc5b5453a2a4ef26d2bc90d9e77ac834804f45

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.2.1-cp312-cp312-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 7192bb4baf21f68235badf573c0e7d779789ba7334e9dec8ed30cda300ee3901
MD5 7ad805684179ddb7e853828484bed41c
BLAKE2b-256 c9f3f1731f7a1dfc6dc2495125092763a86aec5d0955721ac0cd96039e0f42ed

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.2.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 678bddab9c38588a6189bea6b4188e3ca98f55c2b3a37c80bc53cea9cd06fc72
MD5 5cb2f1efd7e297b44fe725faf688c53c
BLAKE2b-256 0e0842c0de7a420905e112026b6a6150fe97b2c345790489ea6645438180c122

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.2.1-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.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 d72e4379fe8d3459bf687d647eb9b6d105f55d5923c81330c1f9bc67b645af19
MD5 65bebde74c08839e938a2aaa5b15c5e6
BLAKE2b-256 18ee6fd040b216e59cfbb122b25eb3e7b0e628133a5599aec8dab303f09e523b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.2.1-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.1-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 f116477fb9c69650008780a3fc471fa6d4056fb89ccc3324f548ac185e271d92
MD5 5ff754946f2015db28edbd2a3108d3d4
BLAKE2b-256 4aa0f37e0676d6019bd045d0d64471f1fca1314b01fb80aff11f17fa8e9345a5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 05da212a787656337dba003a6d6a0678043fb6978d3ba5b3f6e8594a50603211
MD5 85f0f2d60dff7e578434b57bc54d6515
BLAKE2b-256 1f2a9bca46725b1b80df3eb0e0df9fe91a3cb3bb99ac163aa9f72cb59c7f6626

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.2.1-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b3f080cc7826193ff1021f754ee3dbd7ef1d7f8e30d427148e4a5607190f2ca9
MD5 1d4924edad5ecd0ac490c86e0919553a
BLAKE2b-256 4fad84340efe7eaa33c78a56548af432bedacddd0984ce75ae287fd9ddce8ea2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.2.1-cp311-cp311-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 6663a429e33542fd1bded62b84314404d383764fd7ace58ef5174b254d968125
MD5 a2da94a167c3947fa22d87d66d16f317
BLAKE2b-256 28fa6d79e7d7c2361b335d297025565a8323caa4aa99fb0e9d1a9723e9e09e0c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.2.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ec0325ebf274bc8cb3072817601da3f68364075887d9e84098b6c35f71ccb6d8
MD5 19e638abb85d201252885b0fb41dad53
BLAKE2b-256 d75d879e22c56bdd8a45bb19e5291bb4fa7f34f160159d3c75ced0dd7c4e3071

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.2.1-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.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 df41645c99d223e22c049920e7d51bf638195d99509dfb046215ea57ba20910c
MD5 5054d4251f8076411495063186ad2054
BLAKE2b-256 ccebccc611ed09ed0ea5d57e278b1415619c004bdbc14ce9f14f678e04c6b57f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: bocpy-0.2.1-cp310-cp310-win32.whl
  • Upload date:
  • Size: 107.6 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.1-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 892d0594f60faea6ad69b621216d50cad1b5b8f6a346b95ef1cb9fd5940b7c38
MD5 cef9869ba17ee6ef42a1e8c9fd46696a
BLAKE2b-256 e361feab29d4e443e89cf9dd75ff1151b621a64af967bdd5d8539907d5c213bb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 9a4e79b36eefe829c1265f5d7e59aa6ba9a4ca17f383b0f8ed29bd3e7b9b2611
MD5 c75c70e37a713ddbb03a9f3ca971b528
BLAKE2b-256 4416de2335881b6d34c0e49857206bc677972505455fa8741249bb578b258614

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.2.1-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4aac694684ba577e0585bc260c849a3a2ba9cc9aa095da2f8cae102baaae26ba
MD5 877a714ed025d16b8c3949b13b76a516
BLAKE2b-256 4d677e1c2440df926a014496de23a4d1a6e56eec0310d173645e1493db30b029

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.2.1-cp310-cp310-macosx_14_0_x86_64.whl
Algorithm Hash digest
SHA256 b451429420f8c3e0e62fc61c1e8b6bd92ee3924d6dd5a5fe84c71c2a35eedeb8
MD5 7cd820a7113454ad1bc0bc994bd2026c
BLAKE2b-256 8a2507a0157e603df5c823c470d9711fd2cb13c56143e4a155fe39d8d0bc711f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bocpy-0.2.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2493f0a7dfa3c093613dca8494898ea63ae6a346e9654a8ecb435dac7a9653af
MD5 7e4e3b7503510a5e07f4ee34678530c0
BLAKE2b-256 e3d41f0f2767ed588112cce7f34517e0000ff52363cf4c2e7d136ef5365fcb2d

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