Skip to main content

IBM Netezza python driver - extended fork

Project description

nzpy_extended: High-performance IBM Netezza driver for Python

nzpy_extended is a hard fork of IBM nzpy — enriched with new features, major performance improvements via a C extension, and expanded platform support.

Key differences from upstream nzpy

Feature nzpy (IBM) nzpy_extended
Row parsing performance (mixed types, macOS) ~10 000 rows/s ~63 000 rows/s (no C ext) → ~93 000 rows/s (+ C ext)
Supported Python 3.5+ 3.12, 3.13, 3.14
Platform wheels ❌ None ✅ Linux x64, macOS ARM, Windows x64 (pre-built)
Async support ✅ Fully async API
Streaming bulk loading load_data() accepts sync and async iterables; load_csv() streams local CSV files
Sync API (DB-API 2.0) ✅ Full feature parity with async

Windows 11

Data type official nzpy nzpy_extended (no C ext) nzpy_extended (+ C ext) vs. ODBC
INTEGER ~18 k rows/s ~196 k rows/s ~256 k rows/s ≈ ODBC (~239 k)
NUMERIC ~10 k rows/s ~75 k rows/s ~97 k rows/s ≈ ODBC (~90 k)
STRING ~18 k rows/s ~75 k rows/s ~79 k rows/s ≈ ODBC (~69 k)
DATETIME ~18 k rows/s ~135 k rows/s ~255 k rows/s ≈ ODBC (~249 k)
BOOLEAN ~23 k rows/s ~243 k rows/s ~401 k rows/s ≈ ODBC (~359 k)
Mixed ~4 900 rows/s ~36 k rows/s ~45 k rows/s ≈ ODBC (~44 k)

WSL2 (Linux x86_64)

Data type official nzpy nzpy_extended (no C ext) nzpy_extended (+ C ext) vs. ODBC
INTEGER ~21 k rows/s ~203 k rows/s ~640 k rows/s ~92 k rows/s
NUMERIC ~11 k rows/s ~79 k rows/s ~150 k rows/s ~63 k rows/s
STRING ~22 k rows/s ~71 k rows/s ~160 k rows/s ~80 k rows/s
DATETIME ~21 k rows/s ~126 k rows/s ~407 k rows/s ~111 k rows/s
BOOLEAN ~25 k rows/s ~186 k rows/s ~418 k rows/s ~192 k rows/s
Mixed ~5.4 k rows/s ~33 k rows/s ~49 k rows/s ~20 k rows/s

Note: WSL2 results were obtained on the same Netezza server as Windows 11 (192.168.0.144) — the higher throughput reflects Linux network stack efficiency. ODBC results use a ctypes-based ANSI-ODBC fallback (because pyodbc's Unicode API is incompatible with the Netezza ODBC driver on Linux). This wrapper fetches every cell individually via SQLGetData, so ODBC numbers on WSL2 are understated vs. native pyodbc on Windows (which uses SQLBindCol batch fetching). The real ODBC-vs-native gap on Linux is likely smaller.

macOS ARM64 (Apple M4)

Benchmarks run on a Mac mini (Apple M4, 16 GB RAM) — same Netezza server at 192.168.0.144. 100 k rows per query.

Data type official nzpy nzpy_extended (no C ext) nzpy_extended (+ C ext)
INTEGER ~44 k rows/s ~356 k rows/s ~726 k rows/s
NUMERIC ~22 k rows/s ~122 k rows/s ~195 k rows/s
STRING ~39 k rows/s ~143 k rows/s ~183 k rows/s
DATETIME ~42 k rows/s ~253 k rows/s ~683 k rows/s
BOOLEAN ~53 k rows/s ~449 k rows/s ~786 k rows/s
Mixed ~10 k rows/s ~63 k rows/s ~93 k rows/s

The C extension accelerates integer, decimal, datetime, and boolean parsing by avoiding Python object allocations per field and struct.unpack overhead. String parsing is primarily network-bound, so the C extension offers minimal benefit there.

If the compiled extension is not available (unsupported platform or Python version), the driver gracefully falls back to pure Python with identical semantics.

Installation

The package is available on PyPI:

pip install nzpy-extended

Pre-built wheels are provided for:

Platform Architecture Python
Linux x86_64 (manylinux) 3.12 / 3.13 / 3.14
macOS ARM64 (Apple Silicon) 3.12 / 3.13 / 3.14
Windows x86_64 3.12 / 3.13 / 3.14

For other platforms or Python versions, pip install will compile the C extension from source (requires a C compiler: GCC, Clang, or MSVC). On systems without a compiler the install will fail — use a supported platform or version.

Quick Start

Sync — scripts, ETL, Jupyter, Django

import nzpy_extended.sync as nzpy

conn = nzpy.connect(
    user="admin", password="password",
    host="netezza-host", database="mydb",
)

# --- Basic query ---
with conn.cursor() as cur:
    cur.execute("SELECT 1")
    print(cur.fetchone())  # [1]

# --- One-shot convenience (pyodbc pattern) ---
row = conn.execute("SELECT version()").fetchone()
print(row[0])

# --- Parameter binding ---
cur.execute("SELECT id, name FROM users WHERE active = ?", (1,))
for row in cur:
    print(row)

# --- Cursor iteration (batched, arraysize=100) ---
cur.execute("SELECT * FROM large_table")
for row in cur:            # fetches 100 rows per round-trip
    process(row)

# --- Method chaining (PEP 249) ---
rows = cur.execute("SELECT 1, 2, 3").fetchall()

# --- Explicit transaction control ---
conn.autocommit = False
cur.execute("INSERT INTO users (name) VALUES ('Alice')")
cur.execute("INSERT INTO users (name) VALUES ('Bob')")
conn.commit()               # or conn.rollback()
conn.autocommit = True

# --- Transaction context manager ---
with conn.transaction():
    cur.execute("INSERT INTO users (name) VALUES ('Charlie')")
    # auto-commits on success, auto-rollbacks on exception

# --- Timeout (pyodbc-compatible properties) ---
conn.timeout = 5.0          # default for all new cursors
cur = conn.cursor()         # inherits timeout=5.0
cur.execute("SELECT ...")   # raises OperationalError after 5s

cur.timeout = 10.0          # per-cursor override
cur.execute("SELECT ...", timeout=3.0)  # per-execute override wins

# --- Stored procedures ---
result = cur.callproc("sp_add_numbers", [10, 20])
rows = cur.fetchall()

# --- Server notices (RAISE NOTICE) ---
for msg in cur.messages:
    print("Notice:", msg)

# --- PEP 249 rownumber ---
cur.execute("SELECT * FROM t")
print(cur.rownumber)  # 0
cur.fetchone()
print(cur.rownumber)  # 1

# --- Column metadata ---
desc = cur.description       # 7-tuple after execute()
schema = cur.get_schema_table()  # rich metadata as list[dict]

# --- Cancel / interrupt ---
conn.cancel()                # stops running query, session survives
cur.interrupt()              # alias

# --- Connection state ---
print(conn.closed)           # False
conn.close()
print(conn.closed)           # True

Async — FastAPI, asyncio

import asyncio
import nzpy_extended as nzpy

async def main():
    async with await nzpy.connect(
        user="admin", password="password",
        host="netezza-host", database="mydb",
    ) as conn:
        # --- Basic query ---
        async with conn.cursor() as cur:
            await cur.execute("SELECT id, name FROM users WHERE active = ?", (1,))
            return await cur.fetchall()

        # --- One-shot convenience ---
        row = await (await conn.execute("SELECT version()")).fetchone()

        # --- Async iteration (streaming) ---
        cur = conn.cursor()
        await cur.execute("SELECT * FROM large_table")
        async for row in cur:
            process(row)

        # --- Timeout ---
        await cur.execute("SELECT pg_sleep(999)", timeout=3.0)
        # raises OperationalError after 3s

        # --- Stored procedures ---
        result = await cur.callproc("sp_add_numbers", [10, 20])

        # --- Notices ---
        for msg in cur.messages:
            print("Notice:", msg)

asyncio.run(main())

FastAPI with connection pool

from fastapi import FastAPI, Depends
import nzpy_extended as nzpy
import nzpy_extended.fastapi as nzpy_fastapi

pool = nzpy.NzPool(
    min_size=2, max_size=10,
    host="netezza-host", database="mydb",
    user="admin", password="password",
)

app = FastAPI(lifespan=nzpy_fastapi.lifespan(pool))

@app.get("/users")
async def get_users(conn=Depends(nzpy_fastapi.get_connection)):
    async with conn.cursor() as cur:
        await cur.execute("SELECT * FROM users LIMIT 100")
        return await cur.fetchall()

Sync connection pool

import nzpy_extended.sync as nzpy
from nzpy_extended import SyncPool

pool = SyncPool(
    min_size=2, max_size=10,
    host="netezza-host", database="mydb",
    user="admin", password="password",
)
with pool.connection() as conn:
    conn.execute("SELECT 1").fetchone()
pool.close_all()

Bulk data loading via external table protocol

load_data() inserts rows from a Python iterable or async iterable into a Netezza table using the native external table protocol (REMOTESOURCE 'python'). It supports optional automatic table creation. Lists and tuples are materialized as CSV bytes; generators, async generators, and other iterables are streamed to Netezza in chunks.

# --- Sync ---
import nzpy_extended.sync as nzpy
conn = nzpy.connect(...)
count = conn.load_data("my_table", [(1, "Alice"), (2, "Bob")])

# --- Async ---
import nzpy_extended as nzpy
conn = await nzpy.connect(...)
count = await nzpy.load_data(conn, "my_table", [(1, "Alice"), (2, "Bob")])

# --- Auto-infer types from data ---
rows = [(1, "Alice", 100.50), (2, "Bob", 200.75)]
count = conn.load_data("my_table", rows)
# Creates: col1 SMALLINT, col2 VARCHAR(255), col3 NUMERIC

# --- Explicit columns ---
count = conn.load_data(
    table_name="products",
    rows=[(101, "Widget", 9.99)],
    columns=[("id", "INT"), ("name", "VARCHAR(200)"), ("price", "NUMERIC(10,2)")],
)

# --- Generator for large datasets ---
def generate_rows(n):
    for i in range(n):
        yield (i, f"item_{i}")
count = conn.load_data("my_table", rows=generate_rows(50000))

# --- Async generator for streaming ---
async def generate_rows_async(n):
    for i in range(n):
        yield (i, f"item_{i}")
count = await nzpy.load_data(conn, "my_table", rows=generate_rows_async(50000))

Parameters:

Parameter Default Description
conn / table_name / rows (required) Connection, target table, row iterable
columns None [(name, nz_type), ...] or None for auto-infer from data
delimiter '|' Field delimiter
encoding 'LATIN9' Text encoding ('UTF8' for NVARCHAR)
create_if_missing True Auto-create table if not exists
temporary False Create TEMP TABLE
distribute_on_random True Add DISTRIBUTE ON RANDOM
logdir temp dir Netezza log directory
escape_char '\\' Escape character for delimiter within values

Streaming CSV import via load_csv()

load_csv() streams a local CSV file directly into a Netezza table without loading the whole file into memory. It inspects a sample of rows to infer column types when create_if_missing=True, then uses the external table protocol to load the remaining data.

# --- Sync ---
import nzpy_extended.sync as nzpy
conn = nzpy.connect(...)
count = conn.load_csv("my_table", "C:/data/input.csv",
                      delimiter=',', has_header=True, encoding='UTF8')

# --- Async ---
import nzpy_extended as nzpy
conn = await nzpy.connect(...)
count = await nzpy.load_csv(conn, "my_table", "data/input.csv",
                            delimiter=',', has_header=True, encoding='UTF8')
Parameter Default Description
conn / table_name / csv_path (required) Connection, target table, path to local CSV
delimiter ',' Field delimiter
has_header True Use first row as column names when inferring schema
sample_size 1000 Rows read for type inference
encoding 'UTF8' File encoding
create_if_missing True Auto-create table from inferred types
temporary False Create TEMP TABLE
distribute_on_random True Add DISTRIBUTE ON RANDOM
escape_char '\\' Escape character for delimiter within values
logdir temp dir Netezza log directory

Metadata API (catalog introspection)

The conn.meta object provides async access to Netezza system catalog views — tables, columns, views, procedures, distribution keys, storage stats, sessions, and more. All queries run against the current database; connect to SYSTEM for system-wide objects.

import nzpy_extended as nzpy

async def main():
    conn = await nzpy.connect(user="admin", password="password",
                              host="netezza-host", database="mydb")

    # --- Schemas & databases ---
    schemas = await conn.meta.get_schemas()       # ["ADMIN", "INFORMATION_SCHEMA", ...]
    dbs     = await conn.meta.get_databases()     # ["JUST_DATA", "SYSTEM", ...]
    db_name = await conn.meta.get_current_database()   # "JUST_DATA"

    # --- Tables ---
    tables = await conn.meta.get_tables(schema="ADMIN")
    # [{"schema": "ADMIN", "table_name": "DIMDATE", "owner": "ADMIN",
    #   "objtype": "TABLE", "objid": 123456, "row_count": 500000}, ...]

    tables = await conn.meta.get_tables(
        schema="ADMIN", table_pattern="DIM%", include_system=False,
    )

    # --- Views (includes view definition SQL) ---
    views = await conn.meta.get_views(schema="ADMIN")
    # [{"schema": "ADMIN", "view_name": "V_SALES", "owner": "ADMIN",
    #   "objid": 789012, "definition": "CREATE VIEW V_SALES AS SELECT ..."}, ...]

    # --- Columns ---
    cols = await conn.meta.get_columns("DIMDATE", schema="ADMIN")
    # [{"column_name": "DATEKEY", "ordinal": 1,
    #   "data_type": "DATE", "nullable": "N"}, ...]

    # Dot-notation also works:
    cols = await conn.meta.get_columns("ADMIN.DIMDATE")

    # --- Distribution key ---
    dk = await conn.meta.get_distribution_key("FACT_SALES", schema="ADMIN")
    # ["CUSTOMER_ID"]  or [] for RANDOM distribution

    # --- Table sizes ---
    sizes = await conn.meta.get_table_sizes(schema="ADMIN")
    # [{"schema": "ADMIN", "table_name": "FACT_SALES",
    #   "used_bytes": 500000000, "allocated_bytes": 600000000,
    #   "size_mb": 476, "skew": 1.2}, ...]

    # --- Stored procedures ---
    procs = await conn.meta.get_procedures(schema="ADMIN")
    # [{"schema": "ADMIN", "proc_name": "SP_LOAD_DATA",
    #   "owner": "ADMIN", "signature": "SP_LOAD_DATA(VARCHAR(256))",
    #   "returns": "INTEGER", "source": "CREATE PROCEDURE ..."}, ...]

    # --- Sequences & synonyms ---
    seqs = await conn.meta.get_sequences(schema="ADMIN")
    syns = await conn.meta.get_synonyms(schema="ADMIN")

    # --- Sessions ---
    sessions = await conn.meta.get_sessions()
    # [{"session_id": 123, "username": "ADMIN", "database_name": "JUST_DATA",
    #   "conntime": datetime(...), "priority": 0, "status": "active"}, ...]

    # --- Users & groups ---
    users  = await conn.meta.get_users()
    groups = await conn.meta.get_groups()

    # --- Query history (requires history collection enabled) ---
    history = await conn.meta.get_query_history(limit=50, username="ADMIN")

    # --- Search across tables, views, procedures ---
    results = await conn.meta.search_objects("SALES%", schema="ADMIN")
    # [{"object_type": "TABLE", "schema": "ADMIN",
    #   "object_name": "FACT_SALES", "owner": "ADMIN", "objid": 123}, ...]

asyncio.run(main())
Method Returns Notes
get_schemas() list[str] All schemas in current database
get_databases() list[str] All databases visible to user
get_current_database() str Current database name
get_current_schema() str Current schema (search path)
get_tables(schema, pattern, include_system) list[dict] Tables: schema, table_name, owner, objtype, objid, row_count
get_views(schema, pattern) list[dict] Views: schema, view_name, owner, objid, definition (SQL!)
get_columns(table, schema) list[dict] Columns: column_name, ordinal, data_type, nullable, objid
get_distribution_key(table, schema) list[str] Distribution column names (empty = RANDOM)
get_table_sizes(schema, pattern) list[dict] Sizes: used_bytes, allocated_bytes, size_mb, skew
get_procedures(schema, pattern) list[dict] Procs: schema, proc_name, owner, signature, returns, source
get_sequences(schema) list[dict] Sequences: schema, seq_name, owner, objid
get_synonyms(schema) list[dict] Synonyms: schema, synonym_name, ref_database, ref_schema, referenced_object
get_sessions() list[dict] Active sessions: session_id, username, database_name, conntime, priority
get_users() list[dict] Users: username, objid
get_groups() list[dict] Groups: groupname, objid
get_query_history(limit, user) list[dict] History: session_id, username, query_text, submit_time, result_rows
search_objects(pattern, schema) list[dict] Unified search: object_type (TABLE/VIEW/PROCEDURE), schema, object_name

API Reference

Feature Async Sync Notes
connect() nzpy.connect(...) nzpy.sync.connect(...)
cursor() conn.cursor() conn.cursor() Returns Cursor / SyncCursor
execute(sql, params) await cur.execute(...) cur.execute(...) PEP 249, returns cursor
executemany(sql, seq) await cur.executemany(...) cur.executemany(...) Partial failure preserves rowcount
callproc(name, params) await cur.callproc(...) cur.callproc(...) CALL proc_name(args)
fetchone() await cur.fetchone() cur.fetchone() Returns row or None
fetchmany(n) await cur.fetchmany(n) cur.fetchmany(n) Default arraysize=100
fetchall() await cur.fetchall() cur.fetchall()
nextset() await cur.nextset() cur.nextset()
description cur.description cur.description 7-tuple, available after execute
rowcount cur.rowcount cur.rowcount Rows affected
rownumber cur.rownumber cur.rownumber PEP 249, 0-based index
messages cur.messages cur.messages Server notices
arraysize cur.arraysize cur.arraysize Default 100
get_schema_table() cur.get_schema_table() cur.get_schema_table() Rich metadata
conn.execute(sql) await conn.execute(...) conn.execute(...) One-shot convenience
conn.timeout conn.timeout = N Default timeout for cursors
cur.timeout cur.timeout = N Per-cursor timeout
autocommit conn.autocommit conn.autocommit Get/set, default True
closed conn.closed Read-only
commit() / rollback() await conn.commit() conn.commit()
cancel() await conn.cancel() conn.cancel() Session survives
transaction() conn.transaction() Context manager
load_data() await nzpy.load_data(...) nzpy.sync.load_data(...) Bulk insert via external table
conn.load_data() await conn.load_data(...) conn.load_data(...) Method form
conn.meta.get_tables() await conn.meta.get_tables(...) Catalog metadata (async only)
NzPool / SyncPool nzpy.NzPool(...) nzpy.SyncPool(...) Connection pooling

Documentation

Requirements

  • Python ≥ 3.12
  • CPython (PyPy not supported for C extension, pure-Python fallback only)

Testing

Running the test suite

Tests require a running Netezza instance. Set the connection environment variables:

export NZ_DEV_HOST=your_netezza_host
export NZ_DEV_PORT=5480
export NZ_DEV_DB=JUST_DATA
export NZ_DEV_USER=admin
export NZ_DEV_PASSWORD=password

Run all tests:

pytest tests/ -v

C Extension / Pure Python parity

The C extension and pure-Python fallback must produce identical results for all data types. Parity tests verify this in two ways:

Unit tests (tests/test_c_python_parity_unit.py) — compare individual C parser functions against Python reference implementations byte-by-byte. No database required.

pytest tests/test_c_python_parity_unit.py -v

Integration tests (tests/test_c_python_parity_integration.py) — run real SQL queries through both code paths and verify results match. Requires a database.

pytest tests/test_c_python_parity_integration.py -v

Verification script — runs both test suites in C-extension and pure-Python modes side-by-side:

python tools/verify_c_python_parity.py

Disabling C extension at runtime:

Set the environment variable NZPY_EXTENDED_NO_CEXT=1 to force pure-Python mode even when the compiled extension is available. Useful for debugging or verifying fallback correctness.

NZPY_EXTENDED_NO_CEXT=1 pip install nzpy_extended
# or at runtime:
NZPY_EXTENDED_NO_CEXT=1 python -c "import nzpy_extended.core; print(nzpy_extended.core._HAVE_C_EXT)"  # False

Reproducing benchmark results

The per-type benchmark table above is generated by tools/examples/performance_test.py.

Prerequisites

  • A running Netezza instance with a table named JUST_DATA..FACTPRODUCTINVENTORY (or adjust SOURCE_TABLE in the script)
  • Python ≥ 3.12
  • Install the required packages:
pip install nzpy_extended

The official IBM driver is also tested for comparison (pip install nzpy).

Optional (for ODBC comparison):

  • pip install pyodbc — with NetezzaSQL ODBC driver installed (rows labeled pyodbc)
  • Set NZ_ODBC_DRIVER if your ODBC driver uses a different name (default: NetezzaSQL). On Linux/WSL2 the name is defined in /etc/odbcinst.ini, e.g.:
    export NZ_ODBC_DRIVER=NetezzaSQL  # Linux/WSL2
    
  • Linux/WSL2: pyodbc's Unicode API is incompatible with the Netezza ODBC driver. The benchmark auto-detects this and falls back to a ctypes-based ANSI-ODBC wrapper. No additional configuration needed.

Steps

  1. Set connection environment variables:
set NZ_HOST=your_netezza_host     # Windows
set NZ_PORT=5480
set NZ_USER=admin
set NZ_PASSWORD=password
set NZ_DATABASE=JUST_DATA

# or on Linux/macOS:
export NZ_HOST=your_netezza_host
export NZ_PORT=5480
export NZ_USER=admin
export NZ_PASSWORD=password
export NZ_DATABASE=JUST_DATA

All variables have defaults — only NZ_HOST is required if your setup differs from the defaults.

ODBC driver name can be set separately:

export NZ_ODBC_DRIVER=NetezzaSQL  # Linux/macOS — defaults to "NetezzaSQL"
  1. Run the benchmark:
python tools/examples/performance_test.py
  1. Adjust row count (default: 100 000):
set NZ_ROWS=100000     # Windows
export NZ_ROWS=100000  # Linux/macOS

What the script does

  1. Connects using each driver: official_nzpy (always), pyodbc (via ANSI-ODBC ctypes fallback on Linux), nzpy_extended (async + sync, with and without C extension).
  2. Runs six query categories: integer_types, numeric_types, string_types, datetime_types, boolean_types, and all_types (mixed).
  3. Prints per-query timing, a compact DRIVER × TYPE comparison table (matching the README layout), and visual bar charts.

Saving results to a TXT file

Use the --output / -o flag or the NZ_OUTPUT environment variable:

python tools/examples/performance_test.py -o benchmark_results.txt

# or via env var:
set NZ_OUTPUT=benchmark_results.txt
python tools/examples/performance_test.py

Force pure-Python mode

set NZPY_EXTENDED_NO_CEXT=1
python tools/examples/performance_test.py

Pytest benchmark (alternative)

A simpler pytest-based benchmark is also available (10 k rows, nzpy_extended only):

pytest tests/test_benchmark.py -v -m benchmark

License

Apache License 2.0 — see LICENSE.

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

nzpy_extended-0.3.5.tar.gz (148.5 kB view details)

Uploaded Source

Built Distributions

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

nzpy_extended-0.3.5-cp313-cp313-win_arm64.whl (102.3 kB view details)

Uploaded CPython 3.13Windows ARM64

nzpy_extended-0.3.5-cp313-cp313-win_amd64.whl (102.5 kB view details)

Uploaded CPython 3.13Windows x86-64

nzpy_extended-0.3.5-cp313-cp313-musllinux_1_2_x86_64.whl (144.4 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

nzpy_extended-0.3.5-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (148.6 kB view details)

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

nzpy_extended-0.3.5-cp313-cp313-macosx_11_0_arm64.whl (101.2 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

nzpy_extended-0.3.5-cp313-cp313-macosx_10_13_universal2.whl (112.6 kB view details)

Uploaded CPython 3.13macOS 10.13+ universal2 (ARM64, x86-64)

nzpy_extended-0.3.5-cp312-cp312-win_arm64.whl (102.3 kB view details)

Uploaded CPython 3.12Windows ARM64

nzpy_extended-0.3.5-cp312-cp312-win_amd64.whl (102.5 kB view details)

Uploaded CPython 3.12Windows x86-64

nzpy_extended-0.3.5-cp312-cp312-musllinux_1_2_x86_64.whl (144.4 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

nzpy_extended-0.3.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (148.6 kB view details)

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

nzpy_extended-0.3.5-cp312-cp312-macosx_11_0_arm64.whl (101.2 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

nzpy_extended-0.3.5-cp312-cp312-macosx_10_13_universal2.whl (112.5 kB view details)

Uploaded CPython 3.12macOS 10.13+ universal2 (ARM64, x86-64)

File details

Details for the file nzpy_extended-0.3.5.tar.gz.

File metadata

  • Download URL: nzpy_extended-0.3.5.tar.gz
  • Upload date:
  • Size: 148.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for nzpy_extended-0.3.5.tar.gz
Algorithm Hash digest
SHA256 c7a80c93c8de4e89a195f6f6e9ba5ee30f00d9d8760ee95f9920e654462297a0
MD5 51e90b1d684607fb2ebfd0adcd57db88
BLAKE2b-256 cc54461955622befd3384fd0f5f49a3e2d3117a76b62edc1da73b1edeb0479fd

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.5.tar.gz:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file nzpy_extended-0.3.5-cp313-cp313-win_arm64.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.5-cp313-cp313-win_arm64.whl
Algorithm Hash digest
SHA256 fb24f46b1bd7fe1a71ade4f1e2d1d690b4e00d7f7962228ad544c0c91aec5d21
MD5 da02fd984b70c7d8b00f1c82b6caef2f
BLAKE2b-256 fccab2eb4cc377107af9cf5abaebf803b63808eb33d1d29cf42d608b279ae8ad

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.5-cp313-cp313-win_arm64.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file nzpy_extended-0.3.5-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.5-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 a790c674dd0171f769c268f2c83f32c6564722e2f47ec322908a24f68417bb15
MD5 e2992ecfa27a66bbabf5593962f76df3
BLAKE2b-256 d15d7d00c4b5019f31251348e2aa37a14186b3b8a64717278994962f15d05ad0

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.5-cp313-cp313-win_amd64.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file nzpy_extended-0.3.5-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.5-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 aac1422a0241a582318fc98faf7ac48807bb7a2c0e4b601edf48cb6df5755753
MD5 1d71ef5d0129494d9631ae7a884e9b03
BLAKE2b-256 2435a46a448e84b3d0dd51ee7a6e966482d098759b95e3d30bd323eb627aa006

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.5-cp313-cp313-musllinux_1_2_x86_64.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file nzpy_extended-0.3.5-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.5-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5d3488d13d5af73aacc33b273780ff956945cab5e4fd4e604105715ff30e1ecc
MD5 43cf6e3040d8d8940de624597d22b48c
BLAKE2b-256 9e43850a74525a4b208c0b7919398d18ffbf299763b8e12fce4a24c18c8b2372

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.5-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file nzpy_extended-0.3.5-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.5-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7c5d20a985204d344e875f282570bf98fb25303c9a1d9330bbf04396e1f88725
MD5 70a3a9ebfd8590db9ff8fd723b145e13
BLAKE2b-256 31d6ae3160aeb708d9b7fee53d5bb2fc4a1dcecf4dfdc61d0d1d0c8eb29c4532

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.5-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file nzpy_extended-0.3.5-cp313-cp313-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.5-cp313-cp313-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 d91d6fd121cc2bfb63abe07fa6652feb81fabaa1c1eb884fdbac08c801757f33
MD5 bc649e65b7e57fd74630991b06ad76e5
BLAKE2b-256 ff1546b33cc024f291a6487277ead504819b2fcc3d8a74551fcb0429251b6cf5

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.5-cp313-cp313-macosx_10_13_universal2.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file nzpy_extended-0.3.5-cp312-cp312-win_arm64.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.5-cp312-cp312-win_arm64.whl
Algorithm Hash digest
SHA256 17b34d743994eba50cdedb17d626fecb99019b4602344dc24edd6e1e2c598292
MD5 fbdadddde383ea176325378292fe335d
BLAKE2b-256 279f94bd62c3a6556fef5fbb5f0b6f4039905252de8c5a6214b63dfae5256837

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.5-cp312-cp312-win_arm64.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file nzpy_extended-0.3.5-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 cbbdd0b5dbcf03c0591b8d993018ae1095cca42718d7873da7ea3d4180365941
MD5 769a4744689a38ba1a29347960ea14b8
BLAKE2b-256 04b48c66ba93d4d82bd967a493a0d8a03779cf0c15c7659bec0989c3a7cde579

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.5-cp312-cp312-win_amd64.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file nzpy_extended-0.3.5-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.5-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 35a7f4c014dd1bbba3d711c5f981a501c99dbc7e670f78494ff4998116d7b81c
MD5 cde968a2e845d1bf4cea2bd0c6bc0c20
BLAKE2b-256 a66139b57a08d19fd4a57234d2969915a7925457eeb54970312b2bbf3ee9e977

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.5-cp312-cp312-musllinux_1_2_x86_64.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file nzpy_extended-0.3.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a3c31ed73abbb9d2402af945702c5390adc92f4e8c3f07d38a1d5b2d9405fddd
MD5 fb31c08f8cfcba1a3b3bb7c0d4953c68
BLAKE2b-256 c8de7b6df52c900254df9668de7cfa9fd3c5c7ec3cef145c84d2dbad24d25cb7

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file nzpy_extended-0.3.5-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.5-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5aa1c58bdf4cbb7c2560b370b0444c0718204a6419c119a36c12e1f34dddd254
MD5 446712be9c07f4b780b2166ddbdee147
BLAKE2b-256 fcd8b6f78cf3c5dbb10f9c385d963b45f2236e07e5c1b6c1d631ccc420fac048

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.5-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file nzpy_extended-0.3.5-cp312-cp312-macosx_10_13_universal2.whl.

File metadata

File hashes

Hashes for nzpy_extended-0.3.5-cp312-cp312-macosx_10_13_universal2.whl
Algorithm Hash digest
SHA256 1601d80f0fbad824e7ca14ae1ce1372ff479dcbd5f883ef9a15981b9d0b48013
MD5 212d1a42b5b8df1f55e7267977485260
BLAKE2b-256 d809d0aeb468bb3b7a3bc042433a1a5dd293441d35844e7eb714375e6ad1d564

See more details on using hashes here.

Provenance

The following attestation bundles were made for nzpy_extended-0.3.5-cp312-cp312-macosx_10_13_universal2.whl:

Publisher: publish.yaml on KrzysztofDusko/nzpy_extended

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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