{"id":974,"library":"catalogue","title":"catalogue: Super lightweight Function Registries","description":"catalogue is a tiny, zero-dependencies library designed to simplify the creation of function (or object) registries within your Python code. These registries are particularly useful for making objects easily serializable and customizable, allowing you to reference functions by string identifiers instead of direct object references. Currently at version 2.0.10, it maintains an active release cadence with a focus on Python 3.6+ compatibility.","status":"active","version":"2.0.10","language":"python","source_language":"en","source_url":"https://github.com/explosion/catalogue","tags":["registry","function registry","plugin system","extensibility","serialization"],"install":[{"cmd":"pip install catalogue","lang":"bash","label":"Install with pip"}],"dependencies":[],"imports":[{"note":"The primary way to interact with the library is through the top-level 'catalogue' module.","symbol":"catalogue","correct":"import catalogue"},{"note":"While 'create' is a function within the module, it's typically accessed directly after 'import catalogue' as 'catalogue.create()'. Direct import like `from catalogue import create` is also valid for convenience.","wrong":"import catalogue.create","symbol":"create","correct":"from catalogue import create"}],"quickstart":{"code":"import catalogue\n\n# YOUR PACKAGE - Define a registry\nloaders = catalogue.create(\"my_package\", \"loaders\")\n\n# USER CODE - Register custom functions\n@loaders.register(\"file_loader\")\ndef load_from_file(path):\n    print(f\"Loading data from file: {path}\")\n    return f\"Data from {path}\"\n\n@loaders.register(\"db_loader\")\ndef load_from_db(query):\n    print(f\"Loading data from DB with query: {query}\")\n    return f\"Data for {query}\"\n\n# YOUR PACKAGE - Access registered functions\ndef get_data(loader_id, source):\n    loader = loaders.get(loader_id)\n    if loader:\n        return loader(source)\n    else:\n        raise ValueError(f\"Unknown loader: {loader_id}\")\n\nprint(get_data(\"file_loader\", \"/path/to/data.txt\"))\nprint(get_data(\"db_loader\", \"SELECT * FROM users\"))\n\n# List all registered loaders\nprint(\"All registered loaders:\", loaders.get_all())","lang":"python","description":"This example demonstrates how to create a new registry, register functions using the provided decorator, and then retrieve and use those functions by their string identifiers. This pattern enables extensible and serializable configurations for your library."},"warnings":[{"fix":"Upgrade to Python 3.6+ or downgrade `catalogue` to a 1.x version if Python 2.7 support is strictly required.","message":"catalogue v2.0 and newer versions are not compatible with Python 2.7. For Python 2.7 compatibility, users must stick to catalogue v1.x.","severity":"breaking","affected_versions":"2.0.0+"},{"fix":"Always refer to the official PyPI release for the latest stable version. If encountering issues with `2.1.0`, ensure you are on the `2.0.x` branch (currently `2.0.10`).","message":"A `v2.1.0` release was briefly tagged and then yanked from PyPI, with development continuing on the `2.0.x` branch. This might lead to confusion if relying solely on GitHub tags for version discovery, or if package managers inadvertently picked up the yanked `2.1.0`.","severity":"gotcha","affected_versions":"Potentially affects users attempting to install `v2.1.0` or relying on non-PyPI version discovery methods."}],"env_vars":null,"last_verified":"2026-05-12T21:59:50.320Z","next_check":"2026-06-27T00:00:00.000Z","problems":[{"fix":"Install the package using pip: `pip install catalogue`","cause":"The 'catalogue' package is not installed in the current Python environment or is not accessible within the Python path.","error":"ModuleNotFoundError: No module named 'catalogue'"},{"fix":"Ensure the function is correctly decorated with `@your_registry_name.register(\"your_function_name\")` and that the Python module containing this definition is imported and executed before attempting to retrieve it from the registry.","cause":"An attempt was made to retrieve a function from a 'catalogue' registry using a name that has not been registered, or the module defining the registered function was not imported, preventing its registration.","error":"catalogue.RegistryError: [E893] Could not find function '...' in function registry '...'"},{"fix":"Examine the code interacting with the 'Catalog' object to verify the correct attribute name or method call, referring to the API of the specific 'Catalog' class in use.","cause":"This error indicates that an object, likely an instance of a custom 'Catalog' class (which might internally use or be conceptually related to `catalogue`), was accessed for an attribute named 'component' that does not exist on that object.","error":"AttributeError: 'Catalog' object has no attribute 'component'"},{"fix":"Provide a string name to the register decorator or method, for example: `@your_registry.register(\"my_function_name\")`.","cause":"The `@registry.register()` decorator or method was called without providing the mandatory string 'name' argument, which is used to identify the function or object being registered. The `catalogue` library's `register` method explicitly requires a name.","error":"TypeError: register() missing 1 required positional argument: 'name'"}],"ecosystem":"pypi","meta_description":null,"install_score":100,"install_tag":"verified","quickstart_score":null,"quickstart_tag":null,"pypi_latest":"2.0.10","cli_name":"","install_checks":{"last_tested":"2026-05-12","tag":"verified","tag_description":"installs cleanly on critical runtimes, fast import, recently tested","results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.11,"mem_mb":4,"disk_size":"17.9M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.11,"mem_mb":4,"disk_size":"17.9M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":1.5,"import_time_s":0.07,"mem_mb":4,"disk_size":"18M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.07,"mem_mb":4,"disk_size":"18M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.14,"mem_mb":4.8,"disk_size":"19.8M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.16,"mem_mb":4.8,"disk_size":"19.8M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":1.5,"import_time_s":0.12,"mem_mb":4.8,"disk_size":"20M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.12,"mem_mb":4.8,"disk_size":"20M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.12,"mem_mb":4.7,"disk_size":"11.6M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.13,"mem_mb":4.7,"disk_size":"11.6M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":1.4,"import_time_s":0.13,"mem_mb":4.7,"disk_size":"12M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.13,"mem_mb":4.7,"disk_size":"12M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.08,"mem_mb":3.5,"disk_size":"11.4M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.09,"mem_mb":3.5,"disk_size":"11.3M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":1.4,"import_time_s":0.08,"mem_mb":3.3,"disk_size":"12M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.08,"mem_mb":3.3,"disk_size":"12M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.05,"mem_mb":2.8,"disk_size":"17.4M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.06,"mem_mb":2.8,"disk_size":"17.4M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":1.7,"import_time_s":0.05,"mem_mb":2.8,"disk_size":"18M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.05,"mem_mb":2.8,"disk_size":"18M"}]},"quickstart_checks":{"last_tested":"2026-04-24","tag":null,"tag_description":null,"results":[{"runtime":"python:3.10-alpine","exit_code":0},{"runtime":"python:3.10-slim","exit_code":0},{"runtime":"python:3.11-alpine","exit_code":0},{"runtime":"python:3.11-slim","exit_code":0},{"runtime":"python:3.12-alpine","exit_code":0},{"runtime":"python:3.12-slim","exit_code":0},{"runtime":"python:3.13-alpine","exit_code":0},{"runtime":"python:3.13-slim","exit_code":0},{"runtime":"python:3.9-alpine","exit_code":0},{"runtime":"python:3.9-slim","exit_code":0}]}}