Skip to main content

nano_dev_utils

A collection of small Python utilities for developers. PYPI package: nano-dev-utils

Modules

timers.py

This module provides a Timer class for measuring the execution time of code blocks and functions with additional features like timeout control and multi-iteration averaging.

Timer Class

  • __init__(self, precision: int = 4, verbose: bool = False, printout: bool = False): Initializes a Timer instance.

    • precision: The number of decimal places to record and display time durations. Defaults to 4.
    • verbose: Optionally displays the function's positional arguments (args) and keyword arguments (kwargs). Defaults to False.
    • printout: Allows printing to console.
  • def timeit( self, iterations: int = 1, timeout: float | None = None, per_iteration: bool = False, ) -> Callable[[Callable[P, Any]], Callable[P, Any]]::
    Decorator that times either sync or async function execution with advanced features:

    • iterations: Number of times to run the function (for averaging). Defaults to 1.
    • timeout: Maximum allowed execution time in seconds. When exceeded:
      • Raises TimeoutError immediately
      • Warning: The function execution will be aborted mid-operation
      • No return value will be available if timeout occurs
    • per_iteration: If True, applies timeout check to each iteration; otherwise checks total time across all iterations.
    • Features:
      • Records execution times
      • Handles timeout conditions
      • Calculates average execution time across iterations
      • Logs the function name and execution time (with optional arguments)
      • Returns the result of the original function (unless timeout occurs)

Example Usage:

import time
import logging
from nano_dev_utils import timer

# if printout is not enabled, a logger must be configured in order to see timing results
logging.basicConfig(filename='timer example.log',
                    level=logging.INFO,  # DEBUG, WARNING, ERROR, CRITICAL
                    format='%(asctime)s - %(levelname)s: %(message)s',
                    datefmt='%d-%m-%Y %H:%M:%S')

# Basic timing
@timer.timeit()
def my_function(a, b=10):
    """A sample function."""
    time.sleep(0.1)
    return a + b

timer.init(precision=6, verbose=True)
'''Alternative options: 
timer.update({'precision': 6, 'verbose': True})  # 1. Using update method  

from nano_dev_utils.timers import Timer  # 2. explicit instantiation
timer = Timer(precision=6, verbose=True)  
'''

timer.update({'printout': True})  # allow printing to console

# Advanced usage with timeout and iterations
@timer.timeit(iterations=5, timeout=0.5, per_iteration=True)
def critical_function(x):
    """Function with timeout check per iteration."""
    time.sleep(0.08)
    return x * 2

result1 = my_function(5, b=20)  # Shows args/kwargs and timing
result2 = critical_function(10)  # Runs 5 times with per-iteration timeout

dynamic_importer.py

This module provides an Importer class for lazy loading and caching module imports.

Importer Class

  • __init__(self): Initializes an Importer instance with an empty dictionary imported_modules to cache imported modules.

  • import_mod_from_lib(self, library: str, module_name: str) -> ModuleType | Any: Lazily imports a module from a specified library and caches it.

    • library (str): The name of the library (e.g., "os", "requests").
    • module_name (str): The name of the module to import within the library (e.g., "path", "get").
    • Returns the imported module. If the module has already been imported, it returns a cached instance.
    • Raises ImportError if the module cannot be found.

Example Usage:

from nano_dev_utils import importer

os_path = importer.import_mod_from_lib("os", "path")
print(f"Imported os.path: {os_path}")

requests_get = importer.import_mod_from_lib("requests", "get")
print(f"Imported requests.get: {requests_get}")

# Subsequent calls will return the cached module
os_path_again = importer.import_mod_from_lib("os", "path")
print(f"Imported os.path again (cached): {os_path_again}")

release_ports.py

This module provides a PortsRelease class to identify and release processes listening on specified TCP ports.
It supports Windows, Linux, and macOS.

PortsRelease Class

  • __init__(self, default_ports: list[int] | None = None):

  • Initializes a PortsRelease instance.

    • default_ports: A list of default ports to manage. If not provided, it defaults to [6277, 6274].
  • get_pid_by_port(self, port: int) -> int | None: A static method that attempts to find
    a process ID (PID) listening on a given port.

  • It uses platform-specific commands (netstat, ss, lsof).

  • Returns the PID if found, otherwise None.

  • kill_process(self, pid: int) -> bool: A static method that attempts to kill the process with the given pid.

  • It uses platform-specific commands (taskkill, kill -9).

  • Returns True if the process was successfully killed, False otherwise.

  • release_all(self, ports: list[int] | None = None) -> None: Releases all processes listening on the specified ports.

    • ports: A list of ports to release.
    • If None, it uses the default_ports defined during initialization.
    • For each port, it first tries to get the PID and then attempts to kill the process.
    • It logs the actions and any errors encountered. Invalid port numbers in the provided list are skipped.

Example Usage:

import logging
from nano_dev_utils import ports_release, PortsRelease

 
logging.basicConfig(filename='port release.log',
                    level=logging.INFO,  # DEBUG, WARNING, ERROR, CRITICAL 
                    format='%(asctime)s - %(levelname)s: %(message)s',
                    datefmt='%d-%m-%Y %H:%M:%S')


ports_release.release_all()

# Create an instance with custom ports
custom_ports_releaser = PortsRelease(default_ports=[8080, 9000, 6274])
custom_ports_releaser.release_all(ports=[8080, 9000])

# Release only the default ports
ports_release.release_all()

License

This project is licensed under the MIT License. See LICENSE for details.

Metadata

Release files for nano-dev-utils 1.7.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for nano-dev-utils 1.7.0
File Size Uploaded
nano_dev_utils-1.7.0.tar.gz 34.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for nano-dev-utils 1.7.0
File Interpreter ABI Platform
nano_dev_utils-1.7.0-py3-none-any.whl Python 3 none any Details

Total release size: 46.6 kB

Release files / nano_dev_utils-1.7.0.tar.gz

Download URL nano_dev_utils-1.7.0.tar.gz
Size 34.3 kB
Tags Source
SHA-256 checksum
How to use checksums
d9416a144ceeefec5e8af4fb96ae878324b74de0870c633f90909885272e07de
BLAKE2b-256 checksum
How to use checksums
4d59dda64e89fad29639fc3ab5198354e739efc43c1dad322624ad1a67b73572
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.10.11

Release files / nano_dev_utils-1.7.0-py3-none-any.whl

Download URL nano_dev_utils-1.7.0-py3-none-any.whl
Size 12.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
00554215ff1450b8360f8ce9d5720437eb86d641420473040074a36719bc2178
BLAKE2b-256 checksum
How to use checksums
f4b42ace98ea022a2c5511c00a0855e408a265285de30d4a68717b876d7f7a8b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.10.11

Release history Release notifications | RSS feed

This release

1.7.0 This release

2 release files

1.6.2

2 release files

1.6.1

2 release files

1.5.2

2 release files

1.5.1

2 release files

1.4.4

2 release files

1.4.3

2 release files

1.4.2

2 release files

1.4.1

2 release files

1.4.0

2 release files

1.0.0

2 release files

0.5.8

2 release files

0.5.7

2 release files

0.5.6

2 release files

0.5.5

2 release files

0.5.4

2 release files

0.5.3

2 release files

0.5.2

2 release files

0.4.4

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.3.5

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.2.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page