What is the best generic type hint for a dataclass in python?

I have started using dataclasses and I have some specific one lets say for example:

from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int
    job:str
    
@dataclass
class Animal:
    name: str
    age: int

I then have an abstract class like an interface

import abc
from typing import List, Dict


class NameFinder:
    @abc.abstractmethod
    def get_name(self, name: str,being ) :
        pass

class PersonName(NameFinder):
    def get_name(self, name:str, person:Person):
        return person.name

class AnimalName(NameFinder):
    def get_name(self, name:str, animal:Animal):
        return animal.name

what is a good generic type hint i can use in the abstract class as placeholder for both the Person and the Animal classes?

>Solution :

You can define a protocol class, which just asserts the existence of a name attribute.

from typing import Protocol


class Named(Protocol):
    name: str


class NameFinder:
    @staticmethod
    def get_name(obj: Named) -> str:
        return obj.name

# or ...
def name_finder(obj: Named) -> str:
    return obj.name

get_name and name_finder can both accept arguments of type Person or Animal, as both classes define a name attribute for their instances. There’s no need to explicitly mark the classes as implementing the Named protocol.

Leave a Reply