J'utilise le module de frappe Python tout au long de mon projet et je me demandais s'il y avait un moyen de spécifier qu'un objet donné doit être de deux types différents, à la fois. Cela se pose très évidemment lorsque vous avez spécifié deux protocoles et vous attendez à un seul objet de remplir à la fois:
class ReturnsNumbers(Protocol):
def get_number(self) -> Int:
pass
class ReturnsLetters(Protocol):
def get_letter(self) -> str:
pass
def get_number_and_letter(x: <what should this be?>) -> None:
print(x.get_number(), x.get_letter())
3 Réponses :
par Ce commentaire sur le problème pertinent, vous pouvez faire Un protocole d'intersection simple: puis l'utiliser à la place: p>
Créer un nouveau type qui hérite de Tous Types que vous souhaitez combiner, ainsi que protocole code> .
class ReturnsNumbersAndLetters(ReturnsNumbers, ReturnsLetters, Protocol):
pass
def get_number_and_letter(x: ReturnsNumbersAndLetters) -> None:
print(x.get_number(), x.get_letter())
@Amadan fixe et a ajouté un lien vers le PPE pertinent. J'avais supposé que depuis les classes de base déjà héritées de protocole code>, il n'était pas nécessaire de faire à nouveau, mais protocole code> est spécial.
Merci, cela semble être la meilleure façon d'y aller.
Je dirais que les autres solutions présentées ont du mérite, sauf que vous devrez peut-être gérer le cas où vous avez deux objets distincts qui implémentent les deux classes. Si vous savez certainement que l'objet que vous souhaitez hériter des deux renversnumbers code> et renvoie code>, vous pouvez le faire: T = TypeVar(ReturnsNumbers, ReturnsLetters)
def get_number_and_letter(x: T) -> None:
print(x.get_number(), x.get_letter())
Merci - c'est une façon bien rangée de le faire, mais dans ce cas, je ne prévois pas que l'objet héritera de ces classes - l'intention est de s'assurer qu'elles mettent en œuvre les méthodes.
Dans ce cas, vous devez créer deux classes de base avec ces méthodes, puis vous assurer que tout ce qui les utilise hérite des classes de base. AFAIK Il n'y a aucun moyen de faire l'interface dans Python, donc c'est probablement le plus proche que vous obtiendrez.