Learn Languages 2018 ã¨ããã¤ãã³ãã§ãæè¿ã®Pythonã«ã¤ãã¦çºè¡¨ãã¦ãã¾ããã
(䏿¨å¹´ã¾ã§ã¯Lightweight Languageã§LLã¤ãã³ãã ã£ãã®ããå»å¹´ããLearn Languagesã¤ãã³ãã«ãªã£ããããï¼)
www.slideshare.net
ãã£ãããªã®ã§ãã¤ã³ãã ãã§ãæ¸ãèµ·ããã¦è¦ããã¨æãã¾ãã
ãã1~2å¹´ã§ä¾¿å©ã«ãªã£ãæ©è½
1. The pathlib module (PEP 428)
pathlibã¯ãã¡ã¤ã«ãã¹ã«é¢ããã¢ã¸ã¥ã¼ã«ã§3.4ã§å°å ¥ããã¾ããã
ãã ãbuild-inã®openãos.pathã¢ã¸ã¥ã¼ã«ãpathlib.Pathãªãã¸ã§ã¯ããåãå ¥ããããããã«ãªã£ãã®ãPython3.6(PEP519)ã¨ãªã£ã¦ãã¾ãã
3.6以éã§ã¯ãã²os.pathãããpathlibãåªå ãã¦ä½¿ã£ã¦ããããã§ãã
使ç¨ä¾: ã¹ã¯ãªããã®ãã£ã¬ã¯ããªãåå¾
ä»ã¾ã§ã¯ãã¹ã¯ãªããã®ãããã£ã¬ã¯ããªãåå¾ããã¨ã
import os
root_path = os.path.dirname(os.path.abspath(__file__))
ãããªãããã§os.pathã¢ã¸ã¥ã¼ã«ãé§ä½¿ãã¦ãã¾ããã
ããããpathlibã使ãã¨
import pathlib
root_path = pathlib.Path(__file__).resolve().parent
ã¨ããããã«
- ç¾å¨ã®ãã¡ã¤ã«ã®Pathãªãã¸ã§ã¯ããä½ã
- resolveã§ç¸å¯¾ãã¹ã絶対ãã¹ã«è§£æ±º
- 親ãã£ã¬ã¯ããªã®åå¾
ã¿ããã«ç´æçã«ãããããã«ãªãã¾ããã
使ç¨ä¾: ãã£ã¬ã¯ããªä»¥ä¸ã®ãã¡ã¤ã«ã®æ¢ç´¢
ãã£ã¬ã¯ããªä»¥ä¸ã®csvãã¡ã¤ã«æ¢ç´¢ããããªãµãã«ç°¡åã«ããã¾ãã
data_path = pathlib.Path('data') for filename in data_path.glob('**/*.csv'): print(filename) # data/csv/data1.csv # data/csv/data2.csv
ä»ã¾ã§ã¯ os.walk
ã使ã£ã¦æ¸ãã¦ãã®ã«æ¯ã¹ãã¨ã ãã¶æ¥½ã¡ãã§ãã
2. Type hints (PEP 484)
TypeHintã£ã¦ããã®ã¯â¨å¼æ°ã颿°ã®è¿ãå¤ã«å注éãã¤ãããã仿§ã§ãã
def greeting(name: str) -> str: return 'Hello ' + name print(greeting.__annotations__) # {'name': <class 'str'>, 'return': <class 'str'>}
ãã®ãµã³ãã«ã ã¨
- 弿°nameã¯stråã§ãã
- 颿°greetingã¯stråãè¿ã
ã¨ãããã¨ã示ãã¦ãã¾ãã
ããã¯ããã¾ã§éçè§£æã®ããã®æ§æã§ã å®éã«ãã«ãããã¨ãã«åãã§ãã¯çã¯è¡ãããããã§ã¯ããã¾ããã ãããããã®æ§æã«ãã£ã¦IDEçã§ã®è§£æãå¯è½ã«ãªãã¾ãã
ãã ããã¨ãã¨å注éã®è©ä¾¡ã¯ã³ã³ãã¤ã«æã«è¡ããã¦ããã®ã§â¨ã
class C: @classmethod def from_string(cls, source: str) -> C: â¦
ãããªãµãã«Cã¨ããã¯ã©ã¹ãèªåèªèº«ã®ã¯ã©ã¹ãè¿ãã¨ããåæ³¨éãã¤ããã¨ã ãã®æç¹ã§ã¯ã¾ã ã¯ã©ã¹Cã¯ã¯ã©ã¹Cã®åå¨ãç¥ãããå®è¡æã«ã¨ã©ã¼ãèµ·ãã£ã¦ãã¾ã£ã¦ãã¾ããã
ãããè¸ã¾ãã3.7ã§ã¯ã¢ããã¼ã·ã§ã³ã®é å»¶è©ä¾¡(PEP 563) ãå°å ¥ããã¾ããã åæ³¨éã®è©ä¾¡ãå®è¡æã«è¡ãããããã«ãªãããã®ãµã³ãã«ã®ãããªåæ¹åç §ãå¯è½ã«ãªãã¾ããã
ããã§TypeHintãããªã使ãããããªã£ãã®ã§ã¯ãªããã¨æãã¾ãã
ãã ãäºææ§ã®ãªã夿´ã«ãªãã®ã§å©ç¨ããéã«ã¯
from __future__ import annotations
ã®ä¸æãå¿ è¦ã«ãªãã¾ãã
ãã®æåã¯4.0ããæ¨æºã®æåã«ãªãäºå®ã§ãã
3. Data Classes (PEP557)
ã¯ã©ã¹å¤æ°ã¢ããã¼ã·ã§ã³ã使ã£ã¦å¤æ°ãå®ç¾©ãããã¨ã§ã
__init__
, __repr__
, __eq__
, __ne__
, â¨__lt__
, __le__
, __gt__
, __ge__
ãèªåçã«çæã§ããDataClassã3.7ã§å°å
¥ããã¾ããã
ä»ã¾ã§name, age, itemsã®ï¼ã¤ããã£ãâ¨Userã¯ã©ã¹ãå®ç¾©ãããã¨ããã¨ããããªæãã§ããã
from typing import List class User: name: str age: int items: List[int] = None def __init__(self, name: str, age: int = 0): self.name = name self.age = age self.items = [] def __repr__(self): return fâ{self.__class__.__name__}â .... user = User('Taro', 10) # procedue User(name='Taro', age=10, items=[])
ã¤ã³ã¹ã¿ã³ã¹å¤æ°ãå¤ãã¯ã©ã¹ãæ¸ãã¨ãã«ã
ãã®__init__
ã§å¼æ°ã¨ä»£å
¥é¨åã§â¨ä½åº¦ãåã夿°åæ¸ãã®ããã©ãããâ¦â¨ã¨æã£ããã¨ãªãã§ããã
ç§ã¯ããæ£è¦è¡¨ç¾é§ä½¿ãã¦__init__
çæãã¦ã¾ããã
ã¾ãitemã®ããã«mutableãªãªãã¸ã§ã¯ãã¯
颿°ã®â¨ããã©ã«ã弿°ã«item = []â¨
ã¨ããããã«æ¸ããã¨ã¯ã§ãã¾ããã
ä¸è¨ãµã³ãã«ã®ããã«__init__
ã§åæåãæ¸ãããã«ããªãã¨ã
ã¤ã³ã¹ã¿ã³ã¹éã§â¨ãªãã¸ã§ã¯ããã·ã§ã¢ããããããªæåã«ãªã£ã¦ãã¾ãããã§ãã (ããã¯Pythonã®è½ã¨ãç©´ï¼)
3.7ã§å°å ¥ãããDataclasses(PEP 557)ã®dataclassãã³ã¬ã¼ã¿ã使ãã¨ã ä¸è¨ã³ã¼ãã¯ãããªæãã«ãªãã¾ãã
from dataclasses import dataclass, field from typing import List @dataclass class User: name: str age: int items: List[int] = field(default_factory=list) user = User('Taro', 10) # procedue User(name=âTaroâ, age=10, items=[])
__init__
ã__repr__
ããããªãã¦ããããªãããã£ãããã¾ããã
ã¾ãããã®dataclassesã¢ã¸ã¥ã¼ã«ã®field颿°ã使ãã¨â¨ããã©ã«ãå¤ã¨ãã¦listã®ãããªâ¨mutableãªvalueãè¨å®ã§ãã¾ãï¼
dataclassã¯ãããã¾ã§â¨èªåã§ç¹æ®é¢æ°ãã¯ããã¦ãããæ®éã®ã¯ã©ã¹ãªã®ã§ãâ¨ã©ãã©ããã®æ©è½ã¯ä½¿ã£ã¦ãããããããªã¨æã£ã¦ãã¾ãã
Other update
ä»ã«ãç¹ã«é¢ç½ãããªæ°è¦æ©è½ã¨ãã¦ã¯ä»¥ä¸ãæãã¦ããã¾ãã
- (3.6) PEP 498 -- Literal String Interpolation | Python.org âfstring
- (3.7) PEP 553 -- Built-in breakpoint() | Python.org
- (3.7) PEP 567 -- Context Variables | Python.org
èå³ãããæ¹ã¯è¦ã¦ã¿ã¦ãã ããã
ããããã®Python: Python3.8
Python3.8ã¯ãã¾ã®ã¨ãã2019å¹´10æã«ãªãªã¼ã¹äºå®ã§ãã
çµã¿è¾¼ã¾ããäºå®ã®æ©è½ã§ä¸ã¤å¤§ããªã®ãâ¨ãAssignment Expression(ä»£å ¥æ¼ç®å)ã®å°å ¥ããããã®ã§ããã«ã¤ãã¦å°ãã ãæ¸ãã¦ããã¾ãã
Assignment Expressions (PEP 572)
ä»ã¾ã§ãªãæ£è¦è¡¨ç¾ã®matchãããªãã¸ã§ã¯ããâ¨ä¸åº¦å¤æ°ã«å ¥ãã¦ifã§è©ä¾¡ãã¦ãã®ã
match = pattern.match(data) if match: result = match.group(1)
ä»£å ¥æ¼ç®åã使ãã¨ããããªæãã§ä»£å ¥ã¨è©ä¾¡ãåæã«ãããã¨ãã§ãã¾ãã
if (match := pattern.search(data)) is not None: result = match.group(1)
便å©ã§ããã
ããããããã¯æ¬å½ã«Pythonicãªã®ãï¼ã¨ãããã¨ã§ãå°å ¥ã¾ã§ã«ã¯è°è«ãå¼ã³ã¾ããã
Pythonã«ã¯ã Zen of Python (PEP 20) ã®
There should be one-- and preferably only one --obvious way to do it.
ã«ãããããã«ãåããã¨ãè¤æ°ã®æ¸ãæ¹ãã§ããããã«ããªããã¨ãããã¨ã大åã«ãã¦ãã¾ãã
Pythonã¯ã¤ã³ã¯ãªã¡ã³ãæ¼ç®åããªãããããã®é¨åãæ°ã«ãã¦ããã®ã«ã:=
ã¯ããã®ãã»ã»ã»ã¨ããæ°æã¡ã¯å人çã«ã¯ããã¾ãã
ãã Pythonãè²ããªäººã«ä½¿ãããããã«ãªã£ã¦ããã®ã§ã ãã®ãããã¯æè»ã«ãªã£ã¦ããã®ãããããªãã§ãã
(ãã¾ã) Retirements of Guido van Rossum
ã¨ããã§ãæè¿Pythonã®BDFL(Benevolent Dictator For Life, æçµæææ±ºå®è )ã§ããGuidoãBDFLã®å¼éãçºè¡¨ãã¾ããã
... I would like to remove myself entirely from the decision process. I'll still be there for a while as an ordinary core dev, and I'll still be available to mentor people -- possibly more available. But I'm basically giving myself a permanent vacation from being BDFL, and you all will be on your own. ....
[python-committers] Transfer of power
Guidoã¯ãã®ãã¸ã·ã§ã³ã«ã¤ãã¦â¨å¾ç¶è ãæ±ºããã¤ããã¯ãªãã ãã¨ã¯ã¿ããªã§æ±ºãã¦ããã¨ããããã«è¨ã£ã¦ãã¾ãã
ä»å¾ã®Pythonã®æææ±ºå®ãã©ããªã£ã¦ãããã¯è¿½ã£ã¦ããããã¨ããã§ãã