18

How can type hints be declared to indicate that a function returns an instance of the class reference that is passed as an argument?

Declaring it as follows does not seem right, as it indicates that the returned type is the same as the type of the argument:

from typing import TypeVar


T = TypeVar('T')

def my_factory(some_class: T) -> T:
    instance_of_some_class = some_class()
    return instance_of_some_class

Example usage:

class MyClass:
    pass

my_class = my_factory(MyClass)  # Inferred type should be MyClass
1

2 Answers 2

41

According to PEP-484, the right way to do this is to use Type[T] for the argument:

from typing import TypeVar, Type


T = TypeVar('T')

def my_factory(some_class: Type[T]) -> T:
    instance_of_some_class = some_class()
    return instance_of_some_class

It however seems like my editor does not (yet) support this.

Sign up to request clarification or add additional context in comments.

Comments

7

Python 3.12 introduces type parameter lists, which allows generic functions to be defined without explicit TypeVars. Moreover, typing.Type was deprecated in Python 3.9 in favor of using type directly.

The function can be rewritten like so:

def my_factory[T](some_class: type[T]) -> T:
    return some_class()

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.