Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create type hinting for a generic factory method?

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
like image 351
David Pärsson Avatar asked Feb 14 '17 13:02

David Pärsson


People also ask

How do you use type hints in Python?

Here's how you can add type hints to our function: Add a colon and a data type after each function parameter. Add an arrow ( -> ) and a data type after the function to specify the return data type.

What is generic typing Python?

Generic TypesGenerics are not just used for function and method parameters. They can also be used to define classes that can contain, or work with, multiple types. These “generic types” allow us to state what type, or types, we want to work with for each instance when we instantiate the class.

What is the purpose of type hinting?

Type hints improve IDEs and linters. They make it much easier to statically reason about your code. Type hints help you build and maintain a cleaner architecture. The act of writing type hints forces you to think about the types in your program.


1 Answers

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.

like image 85
David Pärsson Avatar answered Oct 12 '22 04:10

David Pärsson