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.
Installieren Sie zuerst das Paket, um mypy
zu verwenden.
$ pip install mypy
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).
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]
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.
Wenn Sie den Wörterbuchtyp verwenden, verwenden Sie typing.Dict
.
dictionary: Dict[str, int] = {'hoge': 1, 'fuga': 2}
Wenn Sie den Taple-Typ verwenden möchten, verwenden Sie typing.Tuple
.
something: Tuple[str, int] = ('hoge', 1)
Wenn Sie den Set-Typ verwenden möchten, verwenden Sie typing.Set
.
Der Set-Typ ist eine einzigartige Sammlung.
something: Set[int] = {6, 7}
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]
Wenn Sie den Iteratortyp verwenden möchten, verwenden Sie typing.Iterator
.
Der Iteratortyp ist eine iterierbare Klasse und muss "iter ()" haben.
something: Iterator = IterableClass()
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}
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
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
Wenn Sie eine Funktion verwenden möchten, verwenden Sie "typing.Callable".
def something() -> bool:
return True
something_callable: Callable = something
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
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)
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
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
Wenn Sie Konstanten verwenden möchten, verwenden Sie typing.Final
.
SOMETHING: Final[str] = 'Something'
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.
https://docs.python.org/ja/3/library/typing.html
Recommended Posts