2017-03-22 2 views
3

Das Typisierungsmodul bietet einige praktische Funktionen, die eine bessere Lesbarkeit und mehr Sicherheit bei der Korrektheit des eingegebenen Codes ermöglichen.Typisierung, benutzerdefinierter Sammlertyp

Eine der besten Eigenschaften ist, dass Sie etwas wie unten schreiben können, um ein Eingabewörterbuch mit bestimmten Elementtypen zu beschreiben.

Jetzt frage ich mich, kann dies zu benutzerdefinierten Typen "erweitert" werden? Können benutzerdefinierte Typen (die wie Container agieren) Indizes auf formale Weise bereitgestellt werden, um einem potenziellen Typprüfer mitzuteilen, dass der Inhalt eines bestimmten Typs sein muss?

Zum Beispiel die collections.Counter Klasse? - Die obige Einschränkung funktioniert nicht, wenn ich wirklich einen Zähler möchte, da Wörterbücher keinen Additionsoperator bereitstellen, wo Zähler dies tun.

Ich könnte so etwas wie tun:

def myFun(inputDict:collections.Counter): pass 

Aber dann verliere ich Informationen darüber, was der Zähler speichert. - Verwenden Sie eine TypeVar den richtigen Ansatz hier?

CounterTy = typing.TypeVar("CounterTy", collections.Counter) 
def myFun(inputDict:CounterTy[str]): pass 

Ich bin mir nicht klar, ob Typevar soll auf diese Weise oder nicht arbeiten. EDIT: nur um klar zu sein, oben Code funktioniert nicht und Fehler auf der TypeVar Zeile.

+0

Es klingt, als ob Sie nach "typing.Generic" suchen, wenn Sie versuchen, Ihre eigenen Typen zu implementieren. Leider ist 'collections.Counter' überhaupt nicht typisiert, so dass Sie diese Syntax nicht verwenden können. – Blckknght

+0

@Blckknght Danke, aber das verwirrt mich, ich versuchte 'typing.Generic [str]' - aber das gibt zurück "TypeError: Anfangsparameter müssen Typ Variablen sein, bekam " – paul23

Antwort

1

Wenn Sie Ihren eigenen Container-Typ zu schreiben und möchte es auf die gleiche Weise typing.Dict und andere Arten parametrieren sind, sollten Sie typing.Generic als eine Ihrer Basen verwenden (mit einem TypeVar als Parameter):

from typing import TypeVar, Generic, Iterable 

T = TypeVar('T') 

class MyContainer(Generic[T]): 
    def __init__(self, iterable:Iterable[T]): 
     ... 

    def foo(self) -> T: 
     ... 

def some_function(arg: MyContainer[str]) -> str: 
    return arg.foo() 
Verwandte Themen