まずは関数の引数・戻り値から
- 全部に書こうとしなくていい
- JavaやCみたいに全部書く必要はない
- 基本的に型をつけるときは名前の後ろに
:
を書いて型 - 関数の戻り値は
->
を使う
def greet(name: str) -> str:
return "Hello, " + name
:
を書いて型->
を使うdef greet(name: str) -> str:
return "Hello, " + name
bool
, bytes
, float
, int
, str
: 何もしなくても使えるNone
: 何も返さない関数に使うdict
, frozenset
, list
, set
, tuple
[]
で書ける
from __future__ import annotaions
(後述)を書くtyping
(次項)から大文字始まりのものをimportするlist[str]
, dict[str, int]
from typing import ...
を書いていた
typing
からimportして使うfrom typing import Any
unknown_variable: Any
Union
: 合併型。3.10以降は|
で表せる
例:文字列と整数をどっちも受け入れる関数
from __future__ import annoations # 3.7 - 3.9は必要
def normalize_year(year: int | str) -> int:
if isinstance(year, int): return year # ここではyearは数値
# これ以降ではyearは文字列
if year.startswith("昭和"): return int(year[2:]) + 1925
elif year.startswith("平成"): return int(year[2:]) + 1988
elif year.startswith("令和"): return int(year[2:]) + 2018
else: raise ValueError('unsupported style')
from typing import Union # for 3.6
def normalize_year(year: Union[int, str]) -> int: pass
from typing import Optional
age: Optional[int]
age = 17
age = None # これも有効
age: int | None # 3.9以降ならこれでもいい
デコレーター関数など、関数を引数に取る関数を書くときに使える
from collections.abc import Callable # 3.9以降
from fuctools import wraps
from typing import Callable # 3.8以前
def validate(func: Callable) -> Callable[..., Callable | tuple[Response, Literal[400]]]:
@wraps(func)
def wrapper(*args, **kw) -> Callable | tuple[Response, Literal[400]]:
try:
j = request.json
if j is None: raise BadRequest
except BadRequest:
return jsonify({"data": [], "errors": {"message": ERROR_MESSAGE, "code": 400}}), 400
return func(*args, **kw)
return wrapper
https://www.python.org/downloads/
バージョン | ステータス | 初回リリース | EOS | PEP |
---|---|---|---|---|
3.9 | バグ修正 | 2020-10-05 | 2025-10 | 596 |
3.8 | バグ修正 | 2019-10-14 | 2024-10 | 569 |
3.7 | セキュリティ | 2018-06-27 | 2023-06-27 | 537 |
3.6 | セキュリティ | 2016-12-23 | 2021-12-23 | 494 |
__future__
モジュール: (dunder future) とはprint_func
, unicode_literals
etc ...[]
を使って中の型を書ける)のimport元が変わったtyping
からだったけど、分散したlist
, tuple
, dict
などの__builtins__
なら何もせずに小文字始まりにするcollections
系(deque, defaultdict)などはcollections
からcollections.abc
からre
contextlib
isinstance()
で聞くときにも使える