uncalled-for
Async dependency injection for Python functions
Decision gist · record as of 2026-08-14
Yes, if you write async Python and want lightweight dependency injection without a framework. Zero runtime dependencies and active maintenance make it low-risk. Alpha status means the API may shift before 1.0, so pin the version or monitor releases. Not suitable for sync-only codebases—this is async-native by design.AI-flagged interpretation of the facts on this page — verify before relying
Before you install
- Requires Python 3.10 or later; async/await syntax mandatory.
- Active maintenance with a recent release (4 days old).
- Zero runtime dependencies keeps installation friction minimal and attack surface small.
License · maintenance · safety
permissive license (permissive) — MIT license permits unrestricted use, modification, and distribution in both open and closed projects with minimal obligations—only attribution and license inclusion required.
last release 2026-08-10 (4 days) · last repo commit 2026-08-10 · 15 stars
0 known vulnerabilities (OSV.dev, 2026-08-14) · 76,554,634 downloads/mo, #445 on PyPI
Alternatives
Verify before relying
pip install uncalled-for
from uncalled_for import Depends
async def get_db():
db = await connect()
try:
yield db
finally:
await db.close()
async def handle_request(db = Depends(get_db)):
await db.execute("SELECT 1")- Performance characteristics under high concurrency or deeply nested dependency graphs.
- Real-world adoption patterns and ecosystem integration (frameworks, testing libraries).
- Stability guarantees given Alpha classification—breaking changes possible before 1.0.
What it is and what it does
uncalled-for is an async dependency injection library that lets you declare function dependencies as parameter defaults, resolving them automatically at call time without a separate container or configuration step. It uses Python's standard library (AsyncExitStack and ContextVar) to manage async context lifetimes, handle cleanup, and support nested dependencies that can reference each other or the outer function's arguments.
The library is designed for async-first Python code—web frameworks, async utilities, and other async-heavy applications. Dependencies can be generators (sync or async) that yield a value and clean up afterward, or plain callables. Each dependency resolves once per function call even if referenced multiple times, and you can bind factory parameters to call arguments or other dependencies using CallArgument and keyword bindings.
Use it for
- Inject database connections into async request handlers with automatic cleanup on completion.
- Wire up async context managers (loggers, caches, clients) into function signatures without manual setup.
- Build nested dependency chains where one async factory depends on another, resolving in order.
- Pass call-specific values (user IDs, request IDs) through dependency factories without changing signatures.
- Test async functions by swapping real dependencies for mocks via Depends bindings.
Worth the install?
AI-flagged interpretation of the facts on this page. Verify before relying on it.
Yes, if you write async Python and want lightweight dependency injection without a framework.
Zero runtime dependencies and active maintenance make it low-risk. Alpha status means the API may shift before 1.0, so pin the version or monitor releases. Not suitable for sync-only codebases—this is async-native by design.
Install
uncalled-for on PyPI
Before you install
Active maintenance with a recent release (4 days old). Zero runtime dependencies keeps installation friction minimal and attack surface small. Early-stage project (Alpha status, first release in February 2026) but actively developed.
Requires Python 3.10 or later; async/await syntax mandatory.
License in practice
MIT license permits unrestricted use, modification, and distribution in both open and closed projects with minimal obligations—only attribution and license inclusion required.
Quickstart
pip install uncalled-for
from uncalled_for import Depends
async def get_db():
db = await connect()
try:
yield db
finally:
await db.close()
async def handle_request(db = Depends(get_db)):
await db.execute("SELECT 1")
Verify before relying
- Performance characteristics under high concurrency or deeply nested dependency graphs.
- Real-world adoption patterns and ecosystem integration (frameworks, testing libraries).
- Stability guarantees given Alpha classification—breaking changes possible before 1.0.
Package facts
| License | permissive license permissive |
| Python support | Supports the current Python release >=3.10 |
| Install friction | Low. Pure-Python wheel |
| Runtime dependencies | None |
| Maintenance | Actively maintained 4 days since the last release |
| Last repo commit | |
| First released | |
| Downloads | 76,554,634 / month, #445 on PyPI 30-day window, as of 2026-08-14 |
| Known vulnerabilities | None known OSV.dev, checked 2026-08-14 |
| Classifiers | Development Status :: 3 - AlphaLicense :: OSI Approved :: MIT LicenseOperating System :: OS IndependentProgramming Language :: Python :: 3Programming Language :: Python :: 3.10Programming Language :: Python :: 3.11Programming Language :: Python :: 3.12Programming Language :: Python :: 3.13Programming Language :: Python :: 3.14Typing :: Typed |
Evidence: uncalled_for-0.4.0-py3-none-any.whl
Tags
Let your AI agent find packages like this
Example. Real query, live index.
You found this page by searching. An agent finds it by wishing: SkillFed indexes 14,416 PyPI packages by what they can do, searchable in plain language.
wish › “async context manager injection”
- uncalled-forProvides async dependency injection for Python functions using…
- async-exit-stackProvides AsyncExitStack, a backport of Python 3.7's asynchronous…
- conditionalConditionally apply a context manager to a code block based on a…
Give your agent the search over MCP, or paste the wish link into any chat.
Similar packages
Enables FastAPI's Depends() dependency injection system to work outside route handlers—in CLI tools, background workers, Celery tasks, and scheduled jobs—without duplicating dependency logic.
The main gotcha is cache management in loops—read the long-running worker documentation before deploying to background tasks.
Converts functions into FastAPI-compatible decorators that can inject and resolve FastAPI dependencies, eliminating boilerplate when building reusable endpoint decorators.
Injector is a Python dependency injection framework that automatically resolves and provides dependencies to your code, reducing boilerplate in larger applications through constructor injection and modular configuration.
Provides a lightweight dependency injection framework for Python that automatically injects dependencies into functions and classes using type annotations or explicit binding declarations.
Install it if you want a simple alternative to heavier frameworks; skip it if your project already uses a framework with built-in DI (Django, FastAPI) or if you…
Wireup is a type-driven dependency injection container for Python that resolves and manages application dependencies at startup, supporting singletons, scoped, and transient lifetimes across sync and async code.
Dependency Injector is a dependency injection framework that assembles and injects object dependencies into functions and methods, supporting factories, singletons, configuration providers, and async injection.
See also async-exit-stack · simple-di · taskiq-dependencies · promise