A Flexible Service Locator
Project description
A Flexible Service Locator for Python.
WARNING ☠️ Not ready yet! ☠️
This project is only public to gather feedback, and everything can and will change until the project is proclaimed stable.
The code has 100% test and type coverage, and the shipped Flask and Pyramid integrations have been in production for years, but the API details can still change.
svcs (pronounced services) is a dependency container for Python. It gives you a central place to register factories for types/interfaces and then imperatively request instances of those types with automatic cleanup and health checks.
It's a flexible Inversion-of-Control container that can be used for dependency injection or service location, but doesn't require global state, decorators, or mangling of function signatures.
Benefits:
- Eliminates tons of repetitive boilerplate code,
- unifies acquisition and cleanups of services,
- provides full static type safety for them,
- simplifies testing through loose coupling,
- and allows for easy health checks across all services.
The goal is to minimize the code for acquiring pluggable services to:
def view(request):
db, api, cache = request.svcs.get(Database, WebAPIClient, Cache)
It's ensured that to a type checker like Mypy, db
has the type Database
, api
has the type WebAPIClient
, and cache
has the type Cache
.
svcs comes with seamless integration for the Flask and Pyramid web frameworks and has first-class async support.
While svcs has first-class support for static typing, it is strictly optional and will always remain so. svcs also doesn't check your types at runtime.
It only forwards the type you have asked for to the type checker. If you don't use a type checker, that information is ignored without any runtime overhead.
Read on in Why?, if you find that intriguing!
Project Links
Release Information
Changed
-
Factory results of None are now treated like every other result and cached. #22
-
Calling
Container.get()
on a service that has an async factory now raises aTypeError
. #21
Added
Credits
svcs is written by Hynek Schlawack and distributed under the terms of the MIT license.
The development is kindly supported by my employer Variomedia AG and all my fabulous GitHub Sponsors.
The Bestagon radar logo is made by Lynn Root, based on an Font Awesome icon. svcs has started out as a wrapper around wired by Michael Merickel and has been heavily influenced by it.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.