[Python] Ich habe nach verschiedenen Typen gesucht! (Tippen)

Einführung

Beginnend mit Python3.5 enthält Python auch das Konzept der Typhinweise. Um es zu verwenden, verwenden Sie den eingebauten Typ oder verwenden Sie "import typing" und verwenden Sie "mypy", um den Typ zu überprüfen.

Über mypy

Installation

Installieren Sie zuerst das Paket, um mypy zu verwenden.

$ pip install mypy

Einstellungsdatei

Erstellen Sie "mypy.ini" wie folgt und geben Sie dort die Einstellungsinformationen ein.

mypy.ini


[mypy]
python_version = 3.8
disallow_untyped_calls = True
disallow_untyped_defs = True
disallow_untyped_decorators = True
disallow_incomplete_defs = True
check_untyped_defs = True
pretty = True

[mypy-django.*]
ignore_missing_imports = True

Informationen zur Konfiguration finden Sie hier (https://mypy.readthedocs.io/en/latest/config_file.html).

Verschiedene Verwendungen

Eingebauter Typ

Der integrierte Typ kann unverändert verwendet werden.

num: int = 1
float_num: float = 1.11
is_something: bool = True
text: str = 'hoge'
byte_str: bytes = b'fuga'
arr: list = [0, 1, 2, 3]

Jeder Typ

Wenn Sie nicht wissen, welcher Typ in die Variable eingefügt wird, verwenden Sie "Beliebig". Wenn dieser Typ angegeben ist, wird keine Typprüfung durchgeführt.

something: Any = Something()

Die Basisklasse aller Typen, "Objekt", kann auf die gleiche Weise verwendet werden, aber "Objekt" wird verwendet, um anzugeben, dass ein Wert auf typsichere Weise als beliebiger Typ verwendet werden kann, und "Beliebig" ist Wird verwendet, um anzuzeigen, dass ein Wert dynamisch eingegeben wird.

Diktatart

Wenn Sie den Wörterbuchtyp verwenden, verwenden Sie typing.Dict.

dictionary: Dict[str, int] = {'hoge': 1, 'fuga': 2}

Tupeltyp

Wenn Sie den Taple-Typ verwenden möchten, verwenden Sie typing.Tuple.

something: Tuple[str, int] = ('hoge', 1)

Typ einstellen

Wenn Sie den Set-Typ verwenden möchten, verwenden Sie typing.Set. Der Set-Typ ist eine einzigartige Sammlung.

something: Set[int] = {6, 7}

Sequenztyp

Wenn Sie den Sequenztyp verwenden möchten, verwenden Sie typing.Sequence. Der Sequenztyp ist eine Datenstruktur zur Verarbeitung in der Reihenfolge (sequentiell).

something: Sequence = [0, 1, 2]

Iteratortyp

Wenn Sie den Iteratortyp verwenden möchten, verwenden Sie typing.Iterator. Der Iteratortyp ist eine iterierbare Klasse und muss "iter ()" haben.

something: Iterator = IterableClass()

Zuordnungstyp

Wenn Sie den Zuordnungstyp verwenden möchten, verwenden Sie "typing.Mapping". Der Zuordnungstyp ist eine Datenstruktur zum Durchführen einer Suche nach beliebigen Schlüsseln und ein unveränderlicher Typ.

something: Mapping[str, int] = {'hoge': 1, 'fuga': 2}

Unionstyp

Wenn Sie den Union-Typ verwenden möchten, verwenden Sie typing.Union. Mit Unionstypen können Sie mehrere Typen angeben.

something_mapping: Mapping[str, int] = {'hoge': 1, 'fuga': 2}
something_union: Union[int, None] = something_mapping.get('hoge') # 1
something_union: Union[int, None] = something_mapping.get('piko') # None

Optionaler Typ

typing.Optional ist ein Bild, in dem immer None vom Typ typing.Union ausgewählt ist.

something_mapping: Mapping[str, int] = {'hoge': 1, 'fuga': 2}
something_optional: Optional[int] = something_mapping.get('hoge') # 1
something_optional: Optional[int] = something_mapping.get('piko') # None

Aufrufbarer Typ

Wenn Sie eine Funktion verwenden möchten, verwenden Sie "typing.Callable".

def something() -> bool:
    return True

something_callable: Callable = something

Wörtlicher Typ

Verwenden Sie typing.Literal, wenn Sie sicherstellen möchten, dass nur ein fester Wert eingegeben wird.

mode: Literal['r', 'rb', 'w', 'wb'] = 'r' # OK
mode: Literal['r', 'rb', 'w', 'wb'] = 'a' # NG

AnyStr-Typ

def concat(a: AnyStr, b: AnyStr) -> AnyStr:
    return a + b

concat(u"foo", u"bar")  #
concat(b"foo", b"bar")  #
concat(u"foo", b"bar")  #

Vector = List[float]
ConnectionOptions = Dict[str, str]
Address = Tuple[str, int]
Server = Tuple[Address, ConnectionOptions]

NewType OK Unicode wird ausgegeben OK Bytes werden ausgegeben NG Ein Fehler tritt auf, weil Unicode und Bytes gemischt sind. Typalias Sie können den vorherigen Typ mit einem beliebigen Typnamen definieren. Verwenden Sie typing.NewType, um verschiedene Typen zu erstellen.

UserId = NewType('UserId', int)
some_id = UserId(524313)

Generika

So verwenden Sie den generischen Typ:

T = TypeVar('T')

#Dies ist die generische Funktion
#Jeder Typ kann für l Sequenztyp verwendet werden
def first(l: Sequence[T]) -> T:
    return l[0]

Benutzerdefinierte generische Typen können wie folgt verwendet werden:

T = TypeVar('T')

class LoggedVar(Generic[T]):
    def __init__(self, value: T, name: str, logger: Logger) -> None:
        self.name = name
        self.logger = logger
        self.value = value

    def set(self, new: T) -> None:
        self.log('Set ' + repr(self.value))
        self.value = new

    def get(self) -> T:
        self.log('Get ' + repr(self.value))
        return self.value

    def log(self, message: str) -> None:
        self.logger.info('%s: %s', self.name, message)

logger: LoggedVar[str] = LoggedVar('hoge', 'Test', Logger())
logger.get() #T wird als str-Typ behandelt

Besetzung (typing.cast)

Wenn Sie den definierten Typ ändern möchten, wandeln Sie ihn mit "typing.cast" um. Um den Vorgang so schnell wie möglich zu gestalten, überprüfen wir zur Laufzeit absichtlich nichts.

a = [4]
b = cast(List[int], a)
c = cast(List[str], a) # [4]Ist niemals eine Zeichenfolge. Wenn Sie sie konvertieren möchten, fügen Sie den Konvertierungsprozess selbst hinzu

Konstante (typing.Final)

Wenn Sie Konstanten verwenden möchten, verwenden Sie typing.Final.

SOMETHING: Final[str] = 'Something'

abschließend

Wie war das? Ich denke, dass Sie eine stärkere Anwendung erstellen können, indem Sie die Typen vollständig nutzen. Beachten Sie jedoch, dass die Angabe des Typs die spezielle Verarbeitung nicht beschleunigt. Einige von ihnen haben nicht wirklich funktioniert. Wenn Sie also etwas falsch finden, lassen Sie es uns bitte wissen.

Referenz

https://docs.python.org/ja/3/library/typing.html

Recommended Posts

[Python] Ich habe nach verschiedenen Typen gesucht! (Tippen)
Ich habe mit Python nach einer Primzahl gesucht
Ich habe nach CD-Befehlen gesucht.
Python-Eingabe
Ich habe einen Unit-Test für verschiedene Sprachen geschrieben
2016-10-30 sonst für Python3> für:
Python [für mich]
Ich habe eine Python-Wörterbuchdatei für Neocomplete erstellt
[Python] Ich habe versucht, den Funktionsnamen durch den Funktionsnamen zu ersetzen
vprof - Ich habe versucht, den Profiler für Python zu verwenden
[Python] Erstellen Sie eine Liste mit verschiedenen Zeichentypen
Ich habe nach Railway Kawayanagi aus den Daten gesucht
Ich habe versucht, mit Python ein Tippspiel zu spielen
Ich habe Python gestartet
Dynamische Eingabe von Python
Ich habe zum ersten Mal versucht, Python zu programmieren.
Ich suchte nach den Fähigkeiten, die erforderlich sind, um Webingenieur bei Python zu werden
Als ich nach "as a Service" von AaaS bis ZaaS suchte, sah ich verschiedene Dienste.
Was ich zum ersten Mal in Python bekommen habe
Ich habe Python zum ersten Mal auf dem Mac ausprobiert.
Ich habe pipenv und asdf für die Python-Versionskontrolle ausprobiert
Ich habe eine VM erstellt, auf der OpenCV für Python ausgeführt wird
Ich habe Python zum ersten Mal mit Heroku ausprobiert
Mongodb Kürzeste Einführung (2) Ich habe nach Zehntausenden gesucht
Python-Übung für Anfänger # 1 [Grundlegende Datentypen / If-Anweisungen]
[Python] Ich habe einen Klassifikator für Iris erstellt [Maschinelles Lernen]
Ich habe nach dem Inhalt von CloudWatch Logs Agent gesucht
Über Python für Schleife
Python-Grundlagen ② für Anweisung
Ich habe Python> autopep8 ausprobiert
Über Python für ~ (Bereich)
Python Lehrbuch für Anfänger
Refactoring-Tools, die mit Python verwendet werden können
Toolchain für Python für Android
[Python] Sammlungstypen sortieren
Ich habe Python> Decorator ausprobiert
Warum ich mich für Python entschieden habe
OpenCV für Python-Anfänger
Organisieren Sie Typen in Python
Ich habe Python more-itertools 2.5 → 2.6 verglichen
Verschiedene Verarbeitung von Python
Installieren Sie Python (für Windows)
[Python] für Anweisungsfehler
Wartung der Python-Umgebung für Projekte
Ich war 2 Minuten lang süchtig nach Python-Debugger-PDF
Ich habe versucht, mit Python faker verschiedene "Dummy-Daten" zu erstellen
Ich habe verschiedene Methoden ausprobiert, um japanische Post mit Python zu senden
Versuchen Sie, verschiedene Informationen anzuzeigen, die für das Debuggen mit Python nützlich sind
Ich habe nach Werken gesucht, die von Naro hoch bewertet werden
Ich habe verschiedene Methoden der Kommunikation zwischen Prozessen bei der Mehrfachverarbeitung von Python3 gemessen
Welches sollte ich für die Datenanalyse studieren, R oder Python?
Ich wusste nicht, wie ich die [Python] für die Anweisung verwenden sollte
Ich habe eine Klasse in Python erstellt und versucht, Enten zu tippen
Verschiedene Hinweise zur Verwendung von Python für Projekte