{"id":5831,"library":"zope-component","title":"Zope Component Architecture","description":"zope.component, along with zope.interface, provides a robust component architecture for Python, enabling the definition, registration, and lookup of loosely coupled components such as adapters and utilities. It is a core part of the Zope Toolkit project. The current version is 7.1. New minor versions are released roughly every 2-6 months, and major versions every 2-3 years, following semantic versioning.","status":"active","version":"7.1","language":"en","source_language":"en","source_url":"https://github.com/zopefoundation/zope.component","tags":["component architecture","dependency injection","event system","zope","interfaces","adapters","utilities"],"install":[{"cmd":"pip install zope.component","lang":"bash","label":"Install latest version"}],"dependencies":[{"reason":"Provides facilities for defining interfaces, which are fundamental to the Zope Component Architecture for describing components. It is a core dependency.","package":"zope.interface","optional":false}],"imports":[{"symbol":"getUtility","correct":"from zope.component import getUtility"},{"symbol":"provideUtility","correct":"from zope.component import provideUtility"},{"symbol":"queryUtility","correct":"from zope.component import queryUtility"},{"note":"Backwards compatibility imports for zope.component.interfaces were removed in version 5.0.0. These interfaces should now be imported directly from zope.interface.interfaces.","wrong":"from zope.component.interfaces import IComponent","symbol":"IComponent","correct":"from zope.interface.interfaces import IComponent"},{"note":"Backwards compatibility imports for zope.component.registry were removed in version 5.0.0. These classes should now be imported directly from zope.interface.registry.","wrong":"from zope.component.registry import ComponentRegistry","symbol":"ComponentRegistry","correct":"from zope.interface.registry import ComponentRegistry"}],"quickstart":{"code":"from zope.interface import Interface, implementer\nfrom zope.component import provideUtility, getUtility, queryUtility, ComponentLookupError\n\n# 1. Define an Interface\nclass IGreeter(Interface):\n    \"\"\"The Greeter interface provides a greeting method.\"\"\"\n    def greet(name: str) -> str:\n        \"\"\"Say hello to the given name.\"\"\"\n\n# 2. Implement the Interface\n@implementer(IGreeter)\nclass HelloGreeter:\n    \"\"\"A simple greeter component.\"\"\"\n    def greet(self, name: str) -> str:\n        return f\"Hello, {name}!\"\n\n# 3. Register the Utility\n# A utility is a component looked up by an interface and an optional name.\n# We can register an instance of the Greeter.\nmy_greeter_instance = HelloGreeter()\nprovideUtility(my_greeter_instance, IGreeter, name='default-greeter')\n\n# You can also register without a name for a singleton utility for the interface\nprovideUtility(HelloGreeter(), IGreeter) # No name, becomes default for IGreeter\n\n# 4. Look up and use the Utility\n# Using getUtility (raises ComponentLookupError if not found)\ntry:\n    default_greeter = getUtility(IGreeter)\n    print(f\"Default greeting: {default_greeter.greet('World')}\")\nexcept ComponentLookupError:\n    print(\"Default greeter not found.\")\n\ntry:\n    named_greeter = getUtility(IGreeter, name='default-greeter')\n    print(f\"Named greeting: {named_greeter.greet('Alice')}\")\nexcept ComponentLookupError:\n    print(\"Named greeter not found.\")\n\n# Using queryUtility (returns None if not found, or a default value if specified)\nmissing_greeter = queryUtility(IGreeter, name='non-existent')\nprint(f\"Querying missing greeter (should be None): {missing_greeter}\")\n\nfallback_greeter = queryUtility(IGreeter, name='non-existent', default='Fallback')\nprint(f\"Querying with fallback: {fallback_greeter}\")\n","lang":"python","description":"This quickstart demonstrates the core functionality of zope.component: defining an interface, implementing it, and then registering and retrieving a utility. Utilities are singletons or named instances that provide a specific interface and can be looked up through the component registry."},"warnings":[{"fix":"Update imports to directly use `zope.interface.interfaces` or `zope.interface.registry`. Replace usage of `zope.component.hookable` with modern alternatives.","message":"Backwards compatibility imports from `zope.component.interfaces`, `zope.component.registry`, and the entire `zope.component.hookable` module were removed.","severity":"breaking","affected_versions":"5.0.0 (2021-03-19) and later"},{"fix":"Ensure your project runs on a supported Python version (currently >=3.10 for zope.component 7.x).","message":"Dropped support for older Python versions, requiring Python 3.7+ (for 6.1+), Python 3.10+ (for 7.1+).","severity":"breaking","affected_versions":"6.0 (2023-04-14) and later (dropped 2.7, 3.5, 3.6). 6.1 (2025-09-09) and later (dropped 3.7, 3.8). 7.1 (2026-02-03) and later (dropped 3.9)."},{"fix":"This is primarily an internal packaging change. If you rely on internal `pkg_resources` mechanisms related to `zope.component`'s namespace, you may need to update your code to reflect PEP 420 standards.","message":"Replaced `pkg_resources` namespace with PEP 420 native namespace.","severity":"breaking","affected_versions":"7.0 (2025-09-12) and later"},{"fix":"Always ensure the order of interfaces specified in adapter declarations and subsequent lookups matches precisely.","message":"The declaration-order of interfaces being adapted to is important for adapter lookup. It must be the same as the order of parameters given to the adapter and used to query the adapter.","severity":"gotcha","affected_versions":"All versions"}],"env_vars":null,"last_verified":"2026-04-14T00:00:00.000Z","next_check":"2026-07-13T00:00:00.000Z"}