Closed3

Python3_型ヒント, dataclassモジュール, typingモジュール(Union, Optional...etc)

かじるかじる

Python実践レシピより

Python3エンジニア認定実践試験メモ

型ヒント

main.py
# 型ヒント
data1: int = 1
data2: float = 1.0
data3: bool = True
data4: str = "Hello"
data5: bytes = b"abc"

# 関数(戻り値がある場合)
def say_hello(name: str) -> str:
    return f"Hello, {name}!!"

print(say_hello("Michel"))
# Hello, Michel!!

# 関数(戻り値が無い場合)
def say_byebye(name: str) -> None:
    print(f"Byebye, {name}!!")

print(say_hello("Jackson"))
# Hello, Jackson!!

# リスト、セット、辞書
foods: list[str] = ["のりしお", "カラムーチョ", "わさビーフ"]
languages: set[str] = {"のりしお", "カラムーチョ", "わさビーフ"}
developers: dict[str, str] = {"のりしお": "カルビー", "カラムーチョ": "湖池屋", "わさビーフ": "山芳製菓"}

# タプル
snacks_ok: tuple[str, str, str] = ("のりしお", "カラムーチョ", "わさビーフ")# OK
snasks_ok: tuple[str, ...] = ("のりしお", "カラムーチョ", "わさビーフ")# OK
snacks_ng: tuple[str] = ("のりしお", "カラムーチョ", "わさビーフ")# NG
かじるかじる

dataclassモジュール

main.py
from random import random
from dataclasses import dataclass

# データクラス
@dataclass
class Chip:
    name: str
    maker: str
    price: int

# Chip型のリスト
chips: list[Chip] = [
    Chip("のりしお", "カルビー", 120),
    Chip("カラムーチョ", "湖池屋", 130),
    Chip("わさビーフ", "山芳製菓", 110)
]

# ランダムでChipを選出
def get_chip(arr: list[Chip]) -> Chip:
    rdm: int = int(len(arr) * random())
    return arr[rdm]

chip: Chip = get_chip(chips)
print(f"{chip.name}({chip.maker}): {chip.price}yen")
# カラムーチョ(湖池屋): 130yen

dataclass -> dictionary/tuple

main.py
from dataclasses import dataclass, asdict, astuple

chip =  Chip("のりしお", "カルビー", 120)

# データクラス -> 辞書/タプル
print(asdict(chip))
# {'name': 'のりしお', 'maker': 'カルビー', 'price': 120}
print(astuple(chip))
# ('のりしお', 'カルビー', 120)
かじるかじる

typingモジュール(Union, Optional, Literal, Any)

main.py
from random import random
from typing import Union, Optional, Literal, Any

# Union: 複数の型を指定
def get_test_union(param: Union[int, str]) -> int:
    if isinstance(param, int): return param
    if isinstance(param, str): return int(param)
    return -1

print(get_test_union(777))# 数値を返す
print(get_test_union("777"))# 文字列を数値に変換して返す

# Optional: 指定した型とNoneの値を許可
def get_test_optional(param: Optional[int]):
    pass

get_test_optional(666)# OK
get_test_optional(None)# OK

# Literal: 特定の値のみ許可
FILE_TYPE = Literal["csv", "json", "xml"]

def get_test_literal(path: str, file_type=FILE_TYPE):
    pass

get_test_literal("hoge.csv", "csv")# OK
get_test_literal("fuga.json", "json")# OK
get_test_literal("piyo.html", "html")# NG

# Any: 任意の型を許可
def get_test_any(param: Any) -> Any:
    if isinstance(param, int): print(f"{param} is int!!")
    if isinstance(param, str): print(f"{param} is str!!")
    pass

# 返り値がint型か、str型が返る関数
def get_rdm_data():
    if random() < 0.5: return 1
    return "Hello"

data: Any = get_rdm_data()# 型付けされていない関数の値
get_test_any(data)
# Hello is str!!
このスクラップは2ヶ月前にクローズされました