I want to use type hint with string as a key and different classes as a value in a dictionary like below.
configurations: Dict[str, what_class??] = {
"dev": Dev,
"product": Product,
"test": Test,
}
The classes Dev, Product, Test inherit from a base class "Parent".
class Parent:
pass
class Dev(Parent):
pass
class Product(Parent):
pass
class Test(Parent):
pass
What is the best way to do the type hint for this?
Do I need to set just "Any" as their type?
CodePudding user response:
Depends on how accurate you want your hints to be,
- Use the parent class
configurations: Dict[str, Parent] = {
"dev": Dev,
"product": Product,
"test": Test,
}
- Specify the classes in a union
from typing import Union
configurations: Dict[str, Union[Dev, Product, Test]] = {
"dev": Dev,
"product": Product,
"test": Test,
}
- Create a TypedDict type for this specific dict
from typing import TypedDict
class EnvDict(TypedDict):
dev: Dev
product: Product
test: Test
configurations: EnvDict = {
"dev": Dev,
"product": Product,
"test": Test,
}
CodePudding user response:
In your case, creating a dictionary without using type hints seems the most optimal solution, as you can access all classes directly from the dict variable configurations, using the proper string key value:
class Parent:
pass
class Dev(Parent):
pass
class Product(Parent):
pass
class Test(Parent):
pass
configurations = {
"dev": Dev,
"product": Product,
"test": Test,
}
print(configurations)
Output:
{'dev': <class '__main__.Dev'>, 'product': <class '__main__.Product'>, 'test': <class '__main__.Test'>}
Also, using the Parent
class works well if you still want to use type hints:
import typing
class Parent:
pass
class Dev(Parent):
pass
class Product(Parent):
pass
class Test(Parent):
pass
configurations: typing.Dict[str, Parent] = {
"dev": Dev,
"product": Product,
"test": Test,
}
print(configurations)
It outputs the same dictionary as the above code.