- 1 1. ã¯ããã«
- 2 2. ãŠããªã³åãšã¯ïŒ
- 3 3. åŸæ¥ã®ãŠããªã³åã®æå®æ¹æ³
- 4 4. æ°ãããŠããªã³åã®æå®æ¹æ³ïŒPEP 604察å¿ïŒ
- 5 5. å®è·µïŒãŠããªã³åã®å¿çšäŸ
- 6 6. 泚æç¹ãšãã¹ããã©ã¯ãã£ã¹
- 7 7. ãããã質åïŒFAQïŒ
- 7.1 Q1. ãŠããªã³åãšAnyåã®éãã¯ïŒ
- 7.2 Q2. Python 3.10以åãšä»¥éã®ãŠããªã³åã¯äºææ§ãããïŒ
- 7.3 Q3. åãã³ãã¯ã³ãŒãã®å®è¡é床ã«åœ±é¿ããïŒ
- 7.4 Q4. ãªãã·ã§ãã«åãšãŠããªã³åã®éãã¯ïŒ
- 7.5 Q5. éç解æããŒã«ã¯å¿ é ïŒ
- 7.6 ãŸãšã
- 8 8. ããããããŒã«ã»ã©ã€ãã©ãª
- 9 9. ãŸãšã
1. ã¯ããã«
Pythonã®åãã³ããšã¯ïŒ
Pythonã¯åçåä»ãèšèªã§ãããå€æ°ã®åãæ瀺çã«æå®ããªããŠãããã°ã©ã ãå®è¡ã§ããŸãããããã倧èŠæš¡ãªãããžã§ã¯ããããŒã éçºã§ã¯ãã³ãŒãã®å¯èªæ§ãä¿å®æ§ãåäžãããããã«åæ å ±ãæ確ã«ããããšãæ±ããããŸãããã®èª²é¡ã解決ããããã«å°å ¥ãããã®ããåãã³ããã§ãã
åãã³ããšã¯ãå€æ°ãé¢æ°ã®åŒæ°ã»æ»ãå€ã«å¯ŸããŠæåŸ ãããããŒã¿åãæ瀺ããæ©èœã§ããããã«ãããã³ãŒããèªãä»ã®éçºè ãå°æ¥ã®èªåèªèº«ããå€æ°ã®æå³ãç解ãããããªããŸãããŸããéç解æããŒã«ã䜿çšããããšã§ãå®è¡åã«åãšã©ãŒãæ€åºã§ããããã«ãªããŸãã
ãŠããªã³åã®éèŠæ§
ãŠããªã³åã¯ãè€æ°ã®ç°ãªãããŒã¿åã蚱容ããããã®åãã³ãã®äžçš®ã§ããããšãã°ãããé¢æ°ãæŽæ°ãŸãã¯æååã®å ¥åãåãåãå¿ èŠãããå ŽåããŠããªã³åã䜿ãã°ãã®æè»æ§ãã³ãŒãã«åæ ã§ããŸãã
以äžã®äŸãèããŠã¿ãŸãããã
from typing import Union
def process_data(data: Union[int, str]) -> None:
print(data)
ãã®é¢æ°ã¯ãæŽæ°ãŸãã¯æååãåãåããããããã®ãŸãŸåºåããŸããåãã³ãã«ãã£ãŠãé¢æ°ãåãåãããšãã§ããããŒã¿åãæ確ã«ãªããããä»ã®éçºè ãå®å¿ããŠå©çšã§ããããã«ãªããŸãã
ãŠããªã³åã®çšé
- ç°ãªãããŒã¿åœ¢åŒã«å¯Ÿå¿ããé¢æ°ãäœæããå Žåã
- APIã¬ã¹ãã³ã¹ãè€æ°ã®åãæã€å¯èœæ§ãããå Žåã
- æè»ãªå ¥å圢åŒã«å¯Ÿå¿ããã©ã€ãã©ãªããŠãŒãã£ãªãã£é¢æ°ã®èšèšæã
æ¬¡ç« ã§ã¯ããŠããªã³åã®åºæ¬çãªäœ¿ãæ¹ã«ã€ããŠããã«è©³ãã解説ããŠãããŸãã
2. ãŠããªã³åãšã¯ïŒ
ãŠããªã³åã®å®çŸ©ãšåºæ¬æŠå¿µ
ãŠããªã³åã¯ãPythonã«ãããŠè€æ°ã®ç°ãªãããŒã¿åã1ã€ã®åãã³ããšããŠæå®ããããã«äœ¿çšãããæ©èœã§ããããã«ãããåŒæ°ãæ»ãå€ãè€æ°ã®åãåãå Žåã§ããã³ãŒãã®æè»æ§ãšåå®å šæ§ãäž¡ç«ãããããšãã§ããŸãã
ãŠããªã³åã¯ãäž»ã«ä»¥äžã®ç®çã§å©çšãããŸãã
- ç°ãªãããŒã¿åœ¢åŒãåãå ¥ããé¢æ°ã®å®çŸ©ã
- æè»ãªããŒã¿åãæ±ãã©ã€ãã©ãªãããŒã«ã®éçºã
- åãã§ãã¯ããŒã«ã«ããäºåæ€èšŒã®åŒ·åã
ãŠããªã³åã®å ·äœäŸ
ããšãã°ãæååãšæ°å€ã®ã©ã¡ããåãåãé¢æ°ãå®çŸ©ããã±ãŒã¹ãèããŸãã
from typing import Union
def add_values(value1: Union[int, float], value2: Union[int, float]) -> Union[int, float]:
return value1 + value2
ãã®äŸã§ã¯ãé¢æ°add_values
ãæŽæ°ããã³æµ®åå°æ°ç¹æ°ãåãå
¥ããæ»ãå€ãšããŠãåãåãè¿ãããšã瀺ããŠããŸãããã®ããã«ããŠããªã³åãå©çšããããšã§è€æ°ã®ããŒã¿åã«å¯Ÿå¿ããã³ãŒããç°¡æœã«èšè¿°ã§ããŸãã
ãŠããªã³åã®ç¹åŸŽ
- æè»æ§
è€æ°ã®åã蚱容ããããšã§ãããŸããŸãªå ¥åããŒã¿ãæ±ãé¢æ°ãã·ã³ãã«ã«å®è£ ã§ããŸãã - åãã§ãã¯ã®åŒ·å
éç解æããŒã«ïŒäŸ: mypyïŒã䜿ãã°ãåãã§ãã¯ã«ãã£ãŠäºåã«ãšã©ãŒãæ€åºã§ããŸãã - å¯èªæ§ã®åäž
é¢æ°ãå€æ°ã®åæ å ±ãæ確ã«ãªããããã³ãŒããèªãéçºè ãç解ãããããªããŸãã
ãŠããªã³åã圹ç«ã€å ·äœäŸ
以äžã®ã³ãŒãã¯ããªã¹ããŸãã¯åäžã®æååãåãåãé¢æ°ã®äŸã§ãã
from typing import Union, List
def format_data(data: Union[str, List[str]]) -> List[str]:
if isinstance(data, list):
return data
else:
return [data]
ãã®é¢æ°ã§ã¯ãåäžã®æååãšæååã®ãªã¹ãã®äž¡æ¹ãåãåããããããªã¹ã圢åŒã§è¿ããŸãããã®ããã«ããŠããªã³åã¯å ¥åããŒã¿ã®æè»æ§ãæ ä¿ããªãããåã®äžè²«æ§ãç¶æããã®ã«åœ¹ç«ã¡ãŸãã
æ¬¡ç« ãžã®æ©æž¡ã
次ã®ã»ã¯ã·ã§ã³ã§ã¯ãPython 3.10以åã§äœ¿çšãããŠãããŠããªã³åã®æå®æ¹æ³ã«ã€ããŠè©³ãã解説ããææ°ããŒãžã§ã³ãšã®éãã玹ä»ããŸãã
3. åŸæ¥ã®ãŠããªã³åã®æå®æ¹æ³
Python 3.10以åã®ãŠããªã³åæå®æ¹æ³
Python 3.10ããåã®ããŒãžã§ã³ã§ã¯ããŠããªã³åãæå®ããããã«typing
ã¢ãžã¥ãŒã«ããUnion
ãã€ã³ããŒãããŠäœ¿çšããå¿
èŠããããŸããããã®æ¹æ³ã¯çŸåšãå©çšå¯èœã§ãããPython 3.10以éã§ã¯ããç°¡æœãªèšè¿°æ¹æ³ãå°å
¥ãããŠããŸãã
åºæ¬çãªäœ¿ãæ¹
以äžã®ã³ãŒãã¯ãPython 3.10以åã®ãŠããªã³åã®äœ¿ãæ¹ã瀺ããŠããŸãã
from typing import Union
def process_input(data: Union[int, float]) -> float:
return float(data)
ãã®äŸã§ã¯ãåŒæ°data
ã¯æŽæ°ãŸãã¯æµ®åå°æ°ç¹æ°ã®ã©ã¡ãããåãåããæ»ãå€ã¯æµ®åå°æ°ç¹æ°ã§ããããšã瀺ããŠããŸããUnion[int, float]
ã«ãã£ãŠãè€æ°ã®åãåãå
¥ããæè»æ§ãä¿èšŒãããŠããŸãã
ãŠããªã³åã®å€æ§ãªäœ¿ãæ¹
è€æ°ã®åŒæ°ã®åãæå®ããå Žå
é¢æ°ãè€æ°ã®ç°ãªãåã®åŒæ°ãåãå ¥ããäŸã§ãã
from typing import Union
def display_value(value: Union[int, str]) -> None:
print(f"Value: {value}")
æ»ãå€ã®åãæè»ã«ããå Žå
é¢æ°ã®æ»ãå€ãè€æ°ã®åãåãäŸã§ãã
from typing import Union
def process_data(data: str) -> Union[int, None]:
if data.isdigit():
return int(data)
return None
ã³ãŒãã®å¯èªæ§ãšèª²é¡
åŸæ¥ã®Union
ã¯éåžžã«åŒ·åã§ããã以äžã®ãããªèª²é¡ããããŸããã
- ã³ãŒããåé·ã«ãªããããã
- é·ãåãªã¹ããæå®ããå Žåã«å¯èªæ§ãäœäžããã
- èšè¿°ãã¹ã«ããåãšã©ãŒãçºçããããã
ã³ãŒãäŸïŒè€éãªåæå®
from typing import Union, List, Tuple
def process_items(items: Union[List[int], Tuple[int, ...]]) -> None:
for item in items:
print(item)
ãã®ã³ãŒãã¯ãæŽæ°ã®ãªã¹ããŸãã¯ã¿ãã«ãåãå
¥ããäŸã§ãããUnion
ã®å€é䜿çšã«ããã³ãŒããé·ããªã£ãŠããŸãã
æ¬¡ç« ãžã®æ©æž¡ã
Python 3.10ã§ã¯ããããã課é¡ã解決ããããã«ããŠããªã³åã®æå®æ¹æ³ãããã·ã³ãã«ã«æ¹åãããŸããã次ã®ã»ã¯ã·ã§ã³ã§ã¯ãPython 3.10以éã®æ°ããèšè¿°æ¹æ³ã詳ãã解説ããŸãã
4. æ°ãããŠããªã³åã®æå®æ¹æ³ïŒPEP 604察å¿ïŒ
Python 3.10ããã®æ°èšæ³ãšã¯ïŒ
Python 3.10ã§ã¯ããŠããªã³åãããã·ã³ãã«ã«èšè¿°ã§ããæ°ããæ§æãå°å ¥ãããŸããããã®å€æŽã¯ãPEP 604ïŒPython Enhancement ProposalïŒã§ææ¡ãããã³ãŒãã®å¯èªæ§ãšèšè¿°å¹çãå€§å¹ ã«åäžãããŸãã
æ°èšæ³ã§ã¯ãåŸæ¥ã®Union
ã®ä»£ããã«ãã€ãæŒç®å|
ã䜿çšããŠè€æ°ã®åãæå®ã§ããŸãã
æ°èšæ³ã®åºæ¬äŸ
以äžã®ã³ãŒãã¯ãæ°èšæ³ã䜿çšãããŠããªã³åã®æå®äŸã§ãã
def process_input(data: int | float) -> float:
return float(data)
ãã®äŸã§ã¯ãé¢æ°process_input
ãæŽæ°ãŸãã¯æµ®åå°æ°ç¹æ°ãåãåããæµ®åå°æ°ç¹æ°ãè¿ãããšã瀺ããŠããŸããåŸæ¥ã®Union[int, float]
ãšåãæå³ãæã¡ãŸãããèšè¿°ãçããªãå¯èªæ§ãåäžããŠããŸãã
æ§èšæ³ãšæ°èšæ³ã®æ¯èŒ
Python 3.10以åïŒæ§èšæ³ïŒ | Python 3.10以éïŒæ°èšæ³ïŒ |
---|---|
Union[int, str] | int | str |
Union[List[int], Tuple[int, ...]] | List[int] | Tuple[int, ...] |
Optional[str] ïŒNoneãå«ãåïŒ | str | None |
æ°èšæ³ã®ã¡ãªãã
- ã³ãŒãã®ç°¡æœå
- æ°èšæ³ã¯æåæ°ãå°ãªããªããåãã³ãã®æå®ãçŽæçã§ç解ãããããªããŸãã
- å¯èªæ§ã®åäž
- ãã€ãæŒç®å
|
ã¯ãè«ççã«ããŸãã¯ããæå³ããããããŠããªã³åã®ç®çãäžç®ã§äŒãããŸãã
- å¯å€é·ã¿ãã«ããªã¹ããšã®äœµçšã容æ
- ãã¹ããããè€éãªåãã·ã³ãã«ã«èšè¿°ã§ããŸãã
æ°èšæ³ã掻çšããå ·äœäŸ
è€æ°ã®ããŒã¿åãåãåãé¢æ°
def display_value(value: int | str) -> None:
print(f"Value: {value}")
æ»ãå€ãè€æ°ã®åãåãé¢æ°
def process_data(data: str) -> int | None:
if data.isdigit():
return int(data)
return None
è€éãªåæå®ã®äŸ
def combine_data(data: list[int] | tuple[int, ...]) -> list[int]:
return list(data)
æ°èšæ³ã®æ³šæç¹ãšäºææ§
- Python 3.10以åã§ã¯äœ¿çšäžå¯
- æ°èšæ³ã¯Python 3.10以éã§ã®ã¿äœ¿çšã§ãããããæ§ããŒãžã§ã³ã®ç°å¢ã§ã¯äºææ§ã«æ³šæããå¿ èŠããããŸãã
- éç解æããŒã«ãšã®äºææ§
mypy
ãªã©ã®éç解æããŒã«ã¯æ°èšæ³ã«å¯Ÿå¿ããŠããŸãããããŒãžã§ã³ã«ãã£ãŠã¯ãµããŒããéå®ãããŠããå ŽåããããŸããäºåã«ç¢ºèªããŸãããã
æ¬¡ç« ãžã®æ©æž¡ã
次ã®ã»ã¯ã·ã§ã³ã§ã¯ãæ°æ§ãŠããªã³åã®èšæ³ãå ·äœçãªã³ãŒãäŸã§æ¯èŒããªãããå®éã®å¿çšäŸãæãäžããŠãããŸããããã«ãããéçºçŸå Žã§ã©ã®ããã«æŽ»çšã§ããã®ããããå®è·µçã«ç解ã§ããããã«ãªããŸãã
5. å®è·µïŒãŠããªã³åã®å¿çšäŸ
ããŒã¿è§£æããŒã«ã§ã®äœ¿çšäŸ
ãŠããªã³åã¯ãããŒã¿è§£æãçµ±èšåŠçã§ããå©çšãããŸãã以äžã¯ãå ¥åããŒã¿ãšããŠæŽæ°ãŸãã¯ãªã¹ããåãå ¥ããããããåŠçããé¢æ°ã®äŸã§ãã
def calculate_average(data: int | list[int]) -> float:
if isinstance(data, int):
return float(data)
elif isinstance(data, list):
return sum(data) / len(data)
else:
raise TypeError("Unsupported data type")
ãã€ã³ã解説
- æè»æ§ã®ç¢ºä¿
- ãã®é¢æ°ã¯ãåäžã®æŽæ°ãšãªã¹ãã®äž¡æ¹ãåŠçã§ãããããå ¥å圢åŒã®å¶éãç·©åããŸãã
- ãšã©ãŒãã³ããªã³ã°
- æ³å®å€ã®ããŒã¿åã«ã¯ãšã©ãŒã¡ãã»ãŒãžãè¿ããåé¡ã®ç¹å®ã容æã«ããŠããŸãã
APIã¬ã¹ãã³ã¹åŠçã®äŸ
APIããã®ã¬ã¹ãã³ã¹ã¯è€æ°ã®åœ¢åŒãåãããšããããŸãããŠããªã³åã¯ãããããç°ãªããã©ãŒããããžã®å¯Ÿå¿ã«åœ¹ç«ã¡ãŸãã
from typing import Any
def parse_response(response: dict[str, Any] | list[dict[str, Any]]) -> list[dict[str, Any]]:
if isinstance(response, dict):
return [response] # åäžãªããžã§ã¯ãããªã¹ãã«å€æ
elif isinstance(response, list):
return response # ãã®ãŸãŸè¿ã
else:
raise ValueError("Invalid response format")
ãã€ã³ã解説
- æè»ãªå ¥å圢åŒãžã®å¯Ÿå¿
- åäžã®ãªããžã§ã¯ããšãªããžã§ã¯ãã®ãªã¹ãã®äž¡æ¹ã«å¯Ÿå¿å¯èœã§ãã
- åºåã®äžè²«æ§ã確ä¿
- ã©ã®åœ¢åŒã§ãåºåããªã¹ãã«ãªããããåŸç¶ã®åŠçãç°¡çŽ åãããŸãã
ãŠãŒã¶ãŒå ¥åãã©ãŒã ã®ããªããŒã·ã§ã³äŸ
ãŠãŒã¶ãŒå ¥åã¯ããŸããŸãªåœ¢åŒãåãããããŠããªã³åã§ããªããŒã·ã§ã³ãæè»ã«è¡ããŸãã
def validate_input(data: str | int | float) -> str:
if isinstance(data, str):
if not data.strip():
raise ValueError("String cannot be empty")
return data
elif isinstance(data, (int, float)):
if data < 0:
raise ValueError("Number cannot be negative")
return str(data)
else:
raise TypeError("Unsupported input type")
è€æ°ã®ããŒã¿åœ¢åŒãåãåãèšå®ç®¡çäŸ
èšå®ãã¡ã€ã«ã®èªã¿èŸŒã¿ã§ã¯ãããŒã¿åœ¢åŒãæååãŸãã¯èŸæžã§ããããšããããããŸãã
def load_config(config: str | dict[str, str]) -> dict[str, str]:
import json
if isinstance(config, str):
# ãã¡ã€ã«ãã¹ã®å Žåã¯JSONãšããŠèªã¿èŸŒã
with open(config, 'r') as file:
return json.load(file)
elif isinstance(config, dict):
# ãã§ã«èŸæžåœ¢åŒãªããã®ãŸãŸè¿ã
return config
else:
raise TypeError("Invalid configuration format")
ãŸãšã
ãããã®å®è·µäŸããããŠããªã³åãæè»ã§å®å šãªã³ãŒãèšè¿°ã«åœ¹ç«ã€ããšãããããŸããããŒã¿è§£æãAPIã¬ã¹ãã³ã¹åŠçããŠãŒã¶ãŒå ¥åæ€èšŒãªã©ãå¹ åºãã·ããªãªã§æŽ»çšå¯èœã§ãã
6. 泚æç¹ãšãã¹ããã©ã¯ãã£ã¹
åãšã€ãªã¢ã¹ã®æŽ»çšæ³
ãŠããªã³åã¯è€æ°ã®åãçµã¿åãããããšã§æè»æ§ãæäŸããŸãããè€éã«ãªãããããšã³ãŒãã®å¯èªæ§ãäœäžããå¯èœæ§ããããŸãããã®è§£æ±ºçãšããŠãåãšã€ãªã¢ã¹ãã®äœ¿çšãæšå¥šãããŸãã
åãšã€ãªã¢ã¹ã®äŸ
DataType = int | float | str
def process_data(data: DataType) -> str:
return str(data)
ãã®äŸã§ã¯ãDataType
ãšãããšã€ãªã¢ã¹ãäœæããããšã§ãè€æ°ã®åæå®ããŸãšããŠããŸããããã«ããã³ãŒããã·ã³ãã«ã«ãªããåå©çšæ§ãåäžããŸãã
éç解æããŒã«ã®æŽ»çš
ãŠããªã³åã䜿çšãããšãã¯ãåãã§ãã¯ããŒã«ã䜵çšããããšã§ã³ãŒãã®ä¿¡é Œæ§ãããã«é«ããããšãã§ããŸãã
mypyã®åºæ¬çãªäœ¿ãæ¹
pip install mypy
mypy script.py
ã³ãŒãäŸïŒ
from typing import Union
def calculate_total(price: int | float, quantity: int) -> float:
return price * quantity
ãã®ã³ãŒããmypyã§è§£æãããšãåã®æŽåæ§ãäºåã«æ€èšŒããã誀ããæªç¶ã«é²ãããšãã§ããŸãã
é床ãªåæå®ã®ãªã¹ã¯
ãŠããªã³åã¯æè»æ§ãæäŸããŸãããé床ã«äœ¿çšãããšã³ãŒãã®è€éæ§ãå¢ããç解ãã¥ãããªãå ŽåããããŸãã
æªãäŸ
def complex_function(data: int | float | str | list[str] | dict[str, int]) -> str:
# è€éãããŠç解å°é£
return str(data)
æ¹åäŸ
SimpleType = int | float | str
ComplexType = list[str] | dict[str, int]
def process_simple(data: SimpleType) -> str:
return str(data)
def process_complex(data: ComplexType) -> str:
return str(data)
åå®å šæ§ãšããã©ã«ãå€ã®èæ ®
é¢æ°ã«ããã©ã«ãå€ãèšå®ããå ŽåããŠããªã³åãšNone
ãçµã¿åãããOptional
ïŒãŸãã¯| None
ïŒã®äœ¿çšã圹ç«ã¡ãŸãã
ããã©ã«ãå€ãæ±ãé¢æ°
def fetch_data(key: str, default: str | None = None) -> str:
data = {"name": "Python", "version": "3.10"}
return data.get(key, default) or "Unknown"
ãŸãšã
ãŠããªã³åãå®å šãã€å¹æçã«äœ¿çšããããã«ã¯ã次ã®ãã€ã³ããæèããŸãããã
- åãšã€ãªã¢ã¹ãå©çšããŠå¯èªæ§ãšåå©çšæ§ãåäžãããã
- éç解æããŒã«ã掻çšããŠäºåã«åãšã©ãŒãæ€åºããã
- åæå®ãé床ã«è€éåãããã·ã³ãã«ã§ç解ããããã³ãŒããå¿ãããã
- ããã©ã«ãå€ããªãã·ã§ã³åãé©åã«æŽ»çšããŠãšã©ãŒãã³ããªã³ã°ã匷åããã
7. ãããã質åïŒFAQïŒ
Q1. ãŠããªã³åãšAnyåã®éãã¯ïŒ
ãŠããªã³åãšAny
åã¯ãè€æ°ã®åãæ±ããç¹ã§å
±éããŠããŸããããã®ç®çãšäœ¿ãæ¹ã«ã¯å€§ããªéãããããŸãã
é ç® | ãŠããªã³å | Anyå |
---|---|---|
åã®æå® | æ確ã«åãæå®ïŒäŸ: int | str ïŒ | ä»»æã®åã蚱容ïŒäŸ: Any ïŒ |
åãã§ã㯠| æå®ãããå以å€ã¯ãšã©ãŒ | åãã§ãã¯ã¯è¡ãããªã |
䜿çšå Žé¢ | éå®ãããåã®çµã¿åãã | åå¶çŽãªãã®æ±çšé¢æ°ãå€æ° |
ã³ãŒãäŸ
ãŠããªã³å:
def display_value(value: int | str) -> None:
print(value)
Anyå:
from typing import Any
def display_value(value: Any) -> None:
print(value)
Q2. Python 3.10以åãšä»¥éã®ãŠããªã³åã¯äºææ§ãããïŒ
ã¯ããäºææ§ããããŸããPython 3.10ã§ã¯æ°èšæ³ãå°å
¥ãããŸããããæ§èšæ³ã®Union
ãåŒãç¶ã䜿çšå¯èœã§ãã
äŸïŒäºææ§ã®ããã³ãŒã
from typing import Union
# æ§èšæ³
def old_union(data: Union[int, str]) -> None:
print(data)
# æ°èšæ³
def new_union(data: int | str) -> None:
print(data)
Q3. åãã³ãã¯ã³ãŒãã®å®è¡é床ã«åœ±é¿ããïŒ
ããããåãã³ãã¯ã³ãŒãã®å®è¡æã«ã¯è©äŸ¡ãããŸãããåãã³ãã¯éçºæ¯æŽæ©èœã§ãããå®è¡æã«ã¯ã€ã³ã¿ãŒããªã¿ã«ãã£ãŠç¡èŠãããŸãã
ãã ããéç解æããŒã«ïŒmypyãªã©ïŒãå©çšããããšã§ã以äžã®ã¡ãªããããããŸãã
- ã³ãŒãã£ã³ã°æã®ãšã©ãŒæ€åºã«ãããã°é²æ¢ã
- IDEã®è£å®æ©èœåŒ·åã«ããéçºå¹çã®åäžã
Q4. ãªãã·ã§ãã«åãšãŠããªã³åã®éãã¯ïŒ
ãªãã·ã§ãã«åã¯ãããåãšNone
ãçµã¿åãããããã®ç¹æ®ãªãŠããªã³åã§ãã以äžã¯ãã®éãã瀺ãäŸã§ãã
ãŠããªã³åã®äŸ
def process_data(data: int | None) -> str:
return str(data) if data is not None else "No data"
ãªãã·ã§ãã«åã®äŸ
from typing import Optional
def process_data(data: Optional[int]) -> str:
return str(data) if data is not None else "No data"
Q5. éç解æããŒã«ã¯å¿ é ïŒ
å¿ é ã§ã¯ãããŸãããã匷ãæšå¥šãããŸãã
çç±
- ã³ãŒãã®å質ãåäžãããã
- ãããã°äœæ¥ãå¹çåããã
- ããŒã éçºã«ãããŠãã³ãŒãã®äžè²«æ§ãä¿ã€ã
äž»ãªããŒã«
- mypy: å³å¯ãªåãã§ãã¯ã«æé©ã
- Pyright: é«éã§ãªã¢ã«ã¿ã€ã åãã§ãã¯ãå®çŸã
mypyã®äœ¿çšäŸ
pip install mypy
mypy script.py
ãŸãšã
ãã®FAQã§ã¯ããŠããªã³åã«é¢ããäžè¬çãªçåãåãäžãããã®éãã䜿ãåãã«ã€ããŠè©³ãã解説ããŸããã
- ãŠããªã³åãš
Any
åã¯çšéãç°ãªããããç®çã«å¿ããŠäœ¿ãåããã - æ°æ§èšæ³ã¯äºææ§ãããã移è¡æéäžã§ãå®å¿ããŠå©çšã§ããã
- éç解æããŒã«ã䜵çšããããšã§ãã³ãŒãå質ãšå®å šæ§ãé«ããããã
8. ããããããŒã«ã»ã©ã€ãã©ãª
mypyïŒéçåãã§ãã¯ããŒã«
mypyãšã¯ïŒ
mypyã¯ãPythonã®åãã³ãã解æããéçåãã§ãã¯ãè¡ãããŒã«ã§ãããŠããªã³åãå«ãåæå®ãæ£ããè¡ãããŠããããæ€èšŒãããã°ã®æ©æçºèŠããµããŒãããŸãã
ç¹åŸŽ
- åãšã©ãŒãäºåã«æ€åºã
- 倧èŠæš¡ãããžã§ã¯ãã§ã®ã³ãŒãå質åäžã
- Pythonã®åãã³ãã«å®å šå¯Ÿå¿ã
ã€ã³ã¹ããŒã«æ¹æ³
pip install mypy
䜿çšäŸ
from typing import Union
def process_input(data: Union[int, str]) -> str:
return str(data)
process_input(100) # OK
process_input("hello") # OK
process_input(10.5) # ãšã©ãŒæ€åº
åãã§ãã¯å®è¡
mypy script.py
PyrightïŒé«éåãã§ãã¯ããŒã«
Pyrightãšã¯ïŒ
Pyrightã¯ãMicrosoftãéçºããPythonçšã®åãã§ãã¯ããŒã«ã§ãç¹ã«VSCodeãšã®çµ±åãã¹ã ãŒãºã§ãããªã¢ã«ã¿ã€ã ã§åãã§ãã¯ãå®è¡ãããŠããªã³åã®æŽ»çšæã«ã䟿å©ã§ãã
ç¹åŸŽ
- é«éãªåãã§ãã¯ã
- VSCodeãšã®ã·ãŒã ã¬ã¹ãªé£æºã
- åæšè«æ©èœã®åŒ·åã
ã€ã³ã¹ããŒã«æ¹æ³
npm install -g pyright
䜿çšäŸ
def validate_input(data: int | str) -> str:
if isinstance(data, int):
return str(data)
elif isinstance(data, str):
return data
return "Invalid input" # ãšã©ãŒæ€åº
PydanticïŒããŒã¿ããªããŒã·ã§ã³ãšåãã§ãã¯
Pydanticãšã¯ïŒ
Pydanticã¯ãåãã³ãã掻çšããŠããŒã¿ããªããŒã·ã§ã³ãšã·ãªã¢ã©ã€ãºãè¡ãã©ã€ãã©ãªã§ãããŠããªã³åã䜿ã£ãè€éãªããŒã¿ã¢ãã«ãç°¡æœã«ç®¡çã§ããŸãã
ç¹åŸŽ
- JSONãAPIã¬ã¹ãã³ã¹ã®ããªããŒã·ã§ã³ã«åŒ·åã
- èªååå€ææ©èœããµããŒãã
- åå®å šãªããŒã¿ã¢ãã«ã®å®çŸ©ãå¯èœã
ã€ã³ã¹ããŒã«æ¹æ³
pip install pydantic
䜿çšäŸ
from pydantic import BaseModel
from typing import Union
class Item(BaseModel):
name: str
value: Union[int, float]
item = Item(name="example", value=42)
print(item)
IDEãµããŒãïŒPyCharmãšVSCode
ã¢ãã³ãªIDEã¯åãã³ãã®è£å®ããšã©ãŒãã§ãã¯æ©èœãåããŠããããŠããªã³åãçšããéçºãå¹çåããŸãã
ããããIDE
- PyCharm: åãã³ãã®è£å®ãšèŠå衚瀺ã匷åãPythonéçºã«ç¹åããæ©èœãå€æ°æèŒã
- VSCode: æ¡åŒµæ©èœïŒPython, PyrightïŒã«ãã£ãŠè»œéãã€é«éã«åãã§ãã¯ãå®çŸã
ãŸãšã
ãããã®ããŒã«ãã©ã€ãã©ãªã掻çšããããšã§ããŠããªã³åãããå¹æçã«äœ¿çšããã³ãŒãã®å®å šæ§ãéçºå¹çãåäžãããããšãã§ããŸãã
æšå¥šããŒã«
- mypy: å³å¯ãªåãã§ãã¯ã«æé©ã
- Pyright: é«éã§ãªã¢ã«ã¿ã€ã åãã§ãã¯ãå®çŸã
- Pydantic: ããŒã¿ããªããŒã·ã§ã³ãè€éãªã¢ãã«ç®¡çã«åŒ·åã
- PyCharm/VSCode: ã³ãŒãè£å®ãšãšã©ãŒãã§ãã¯æ©èœãéçºå¹çãé«ããã
ã
9. ãŸãšã
ãŠããªã³åã®å©äŸ¿æ§ãšé²åã®èŠç¹æŽç
æ¬èšäºã§ã¯ãPythonã«ããããŠããªã³åã«ã€ããŠåºæ¬æŠå¿µããå¿çšäŸããã¹ããã©ã¯ãã£ã¹ãŸã§è©³ãã解説ããŸããã
以äžã¯ããŠããªã³åã«é¢ããäž»èŠãªãã€ã³ãã®æ¯ãè¿ãã§ãã
- åºæ¬æŠå¿µ
- ãŠããªã³åã¯ãè€æ°ã®åã蚱容ããããã®åãã³ãæ©èœã
- æè»æ§ã確ä¿ãã€ã€åå®å šæ§ãç¶æã§ããã
- æ§èšæ³ãšæ°èšæ³ã®éã
- Python 3.10以åã¯
Union[X, Y]
ã䜿çšã - Python 3.10以éã¯ãã€ãæŒç®å
X | Y
ã§ç°¡æœã«èšè¿°å¯èœã
- å¿çšäŸãšæŽ»çšã·ãŒã³
- ããŒã¿è§£æãAPIã¬ã¹ãã³ã¹åŠçãå ¥åæ€èšŒãªã©ãå®è·µçãªã·ããªãªã§å©çšã
- è€éãªåã®ç®¡çã«ã¯åãšã€ãªã¢ã¹ã䜿çšããŠå¯èªæ§ãåäžã
- 泚æç¹ãšãã¹ããã©ã¯ãã£ã¹
- éç解æããŒã«ïŒmypy, PyrightïŒã䜵çšããåãšã©ãŒãäºåæ€åºã
- é床ãªåæå®ã¯é¿ããã·ã³ãã«ã§ç解ããããæ§é ãç®æãã
- ããããããŒã«ã»ã©ã€ãã©ãª
- mypyãPyrightã§éç解æã匷åã
- Pydanticã䜿ã£ãŠããŒã¿ããªããŒã·ã§ã³ãã¢ãã«ç®¡çãå¹çåã
Python 3.10以éã§ã®éçºå¹çåäžãææ¡
Python 3.10ã§ã®æ°èšæ³ã«ããããŠããªã³åã®èšè¿°ãæ Œæ®µã«ç°¡æœã«ãªããŸãããããã«ãããéçºå¹çãåäžãããšãšãã«ãã³ãŒãã®å¯èªæ§ãšä¿å®æ§ãå€§å¹ ã«åŒ·åãããŠããŸãã
æ°èšæ³ã掻çšããäŸïŒ
def process_input(data: int | str) -> str:
return str(data)
ãã®ããã«ãç°¡æœã§çŽæçãªã³ãŒããæžãããšãå¯èœã«ãªããããã¢ãã³ãªããã°ã©ãã³ã°ã¹ã¿ã€ã«ãå®çŸã§ããŸãã
èªè ãžã®æ¬¡ã®ã¹ãããã®æ瀺
ãŠããªã³åã®åºæ¬ãšå¿çšãåŠãã èªè ããããã«ã¹ãã«ã磚ãããã«ä»¥äžã®ã¢ã¯ã·ã§ã³ãããããããŸãã
- å®è·µçšèª²é¡ã«åãçµã
- å®éã®ãããžã§ã¯ãã§ãŠããªã³åã䜿çšããããŒã¿æ€èšŒãAPIåŠçãè©ŠããŠã¿ãã
- è¿œå åŠç¿ãªãœãŒã¹ã掻çšãã
- Pythonå ¬åŒããã¥ã¡ã³ãïŒpython.orgïŒãåç §ããŠææ°æ©èœã確èªã
- åãã§ãã¯ããŒã«ã®ããã¥ã¡ã³ãïŒmypy, PyrightïŒã掻çšããããŒã«ã®èšå®ãé«åºŠãªäœ¿ãæ¹ãåŠã¶ã
- ãããžã§ã¯ããžã®é©çš
- æ¢åã®ã³ãŒãã«ãŠããªã³åãå°å ¥ããå¯èªæ§ãšå®å šæ§ãåäžãããã
- ããŒãžã§ã³ç®¡çããŒã«ïŒGitãªã©ïŒãå©çšããŠå€æŽç¹ãèšé²ããªããåŸã ã«ã¢ããããŒãã
æåŸã«
ãŠããªã³åã¯ãPythonã³ãŒãã®æè»æ§ãšåå®å šæ§ã匷åããããã®åŒ·åãªæ©èœã§ããç¹ã«Python 3.10以éã®æ°èšæ³ã§ã¯ãã³ãŒãèšè¿°ãç°¡æœã«ãªããå®çšæ§ãããã«é«ãŸããŸããã
ãã®ã¬ã€ããåèã«ããªããããŠããªã³åãç©æ¥µçã«æŽ»çšããå®è·µçãªããã°ã©ãã³ã°ã¹ãã«ãåäžãããŠãã ããã
ãããããPythonã®ã¹ãã«ã¢ãããç®æããŠé 匵ã£ãŠãã ããïŒ