Typing Caveats

Abstract Classes and PEP 544

If you try to get() an abstract class like an Protocol or an abstract base class you’ll get a Mypy error like this:

error: Only concrete class can be given where "type[P]" is expected  [type-abstract]

Unfortunately, it’s impossible to type-hint type[P] when P is abstract because it’s forbidden by PEP 544.

As a stopgap, until we get something better in Python typing, svcs comes with Container.get_abstract() and Container.aget_abstract() that are type-hinted to return Any. Since Any disables any kind of type-checking, you have to use it like this:

ac: SomeAbstractClass = container.get_abstract(SomeAbstractClass)

You can also create bespoke wrappers for your services:

def get_connection() -> Connection:
    return svcs.flask.get_abstract(Connection)

Finally, you can disable this error by adding the following line to your Mypy configuration:

disable_error_code = ["type-abstract"]

… or by calling Mypy with the --disable-error-code=type-abstract argument.

Multiple Services

Another caveat is that it’s necessary to define multiple return values for get() for every single arity. We’ve done it for up to ten service types which should be plenty.