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ヶ月前にクローズされました