ä»æ¥ã¯ãDropbox ã Python ã³ãŒãã®åå¶åŸ¡ãã©ã®ããã«æ±ããã«é¢ããè³æã®ç¿»èš³ã®æåã®éšåã玹ä»ããŸãã
Dropbox 㯠Python ã§å€ãã®ããšãèšè¿°ããŠããŸãã ããã¯ãããã¯ãšã³ã ãµãŒãã¹ãšãã¹ã¯ããã ã¯ã©ã€ã¢ã³ã ã¢ããªã±ãŒã·ã§ã³ã®äž¡æ¹ã§éåžžã«åºã䜿çšãããŠããèšèªã§ãã GoãTypeScriptãRust ããã䜿çšããŸãããäž»ãªèšèªã¯ Python ã§ãã ç§ãã¡ã®èŠæš¡ãèæ ®ãããšãæ°çŸäžè¡ã® Python ã³ãŒãã«ã€ããŠè©±ããŠããã®ã§ããããã®ãããªã³ãŒãã®åçåä»ãã¯ç解ãäžå¿ èŠã«è€éã«ããåŽåçç£æ§ã«æ·±å»ãªåœ±é¿ãäžãå§ããŠããããšãå€æããŸããã ãã®åé¡ã軜æžããããã«ãmypy ã䜿çšããŠã³ãŒããéçåãã§ãã¯ã«åŸã ã«ç§»è¡ãå§ããŸããã ããã¯ãããããPython ã®æã人æ°ã®ããã¹ã¿ã³ãã¢ãã³åãã§ã㯠ã·ã¹ãã ã§ãã Mypy ã¯ãªãŒãã³ãœãŒã¹ ãããžã§ã¯ãã§ãããäž»ãªéçºè 㯠Dropbox ã§åããŠããŸãã
Dropbox ã¯ããã®èŠæš¡ã§ Python ã³ãŒãã«éçåãã§ãã¯ãå®è£ ããæåã®äŒæ¥ã® XNUMX ã€ã§ãã Mypy ã¯æè¿ãäœåãã®ãããžã§ã¯ãã§äœ¿çšãããŠããŸãã 圌ããèšãããã«ããã®ããŒã«ã¯äœåºŠããå®æŠã§ãã¹ãããããã®ã§ãã ç§ãã¡ã¯ä»ã®å°äœã«å°éãããŸã§é·ãéã®ããæ©ãã§ããŸããã ãã®éçšã§ãå€ãã®å€±æããäºæ¥ã倱æããå®éšããããŸããã ãã®æçš¿ã§ã¯ãç§ã®ç 究ãããžã§ã¯ãã®äžç°ãšããŠã®å°é£ãªå§ãŸããããPython ã§äœæããç¡æ°ã®éçºè ã«ãšã£ãŠåãã§ãã¯ãšåãã³ããäžè¬çã«ãªã£ãçŸåšã«è³ããŸã§ãPython ã®éçåãã§ãã¯ã®æŽå²ã説æããŸãã ãããã®ã¡ã«ããºã ã¯çŸåšãIDE ãã³ãŒã ã¢ãã©ã€ã¶ãŒãªã©ã®å€ãã®ããŒã«ã§ãµããŒããããŠããŸãã
ãªãåãã§ãã¯ãå¿ èŠãªã®ã§ãããã?
åçåä»ãããã Python ã䜿çšããããšãããå Žåã¯ããªãæè¿éçåä»ããš mypy ã«ã€ããŠããã»ã©å€§éšãããŠããã®ãã«ã€ããŠæ··ä¹±ãããããããŸããã ãããã¯ãåçåä»ãã®ããã㧠Python ã奜ããªã®ã«ãèµ·ãã£ãŠããããšã«åçŽã«åæºããŠããã®ãããããŸããã éçåä»ãã®äŸ¡å€ã®éµã¯ããœãªã¥ãŒã·ã§ã³ã®èŠæš¡ã§ãããããžã§ã¯ãã倧èŠæš¡ã«ãªãã°ãªãã»ã©ãéçåä»ããžã®åŸããé«ãŸããæçµçã«ã¯éçåä»ããæ¬åœã«å¿ èŠã«ãªããŸãã
ãããããžã§ã¯ããæ°äžè¡ã®ãµã€ãºã«éããæ°äººã®ããã°ã©ããŒãäœæ¥ããŠããããšãå€æãããšããŸãã ç§ãã¡ã®çµéšã«åºã¥ããŠãåæ§ã®ãããžã§ã¯ããèŠããšããã®ã³ãŒããç解ããããšãéçºè ã®çç£æ§ãç¶æããéµã«ãªããšèšããŸãã åã¢ãããŒã·ã§ã³ããªããšãããšãã°ãé¢æ°ã«æž¡ãåŒæ°ãé¢æ°ãè¿ãããšãã§ããåãææ¡ããããšãå°é£ã«ãªãããšããããŸãã åã¢ãããŒã·ã§ã³ã䜿çšããªããšçããã®ãé£ããå žåçãªè³ªåã次ã«ç€ºããŸãã
- ãã®é¢æ°ã¯è¿ããŸãã
None
? - ãã®è°è«ã¯ã©ãããã¹ãã§ãããã?
items
? - å±æ§ã¿ã€ããšã¯äœã§ãã
id
:int
ããã¯...ã§ãããstr
ããããšãã«ã¹ã¿ã ã¿ã€ãã§ããããïŒ - ãã®åŒæ°ã¯ãªã¹ãã«ããå¿ èŠããããŸãã? ã¿ãã«ãæž¡ãããšã¯å¯èœã§ãã?
次ã®åã¢ãããŒã·ã§ã³ä»ãã³ãŒã ã¹ãããããèŠãŠãåæ§ã®è³ªåã«çããŠã¿ããšããããæãåçŽãªã¿ã¹ã¯ã§ããããšãããããŸãã
class Resource:
id: bytes
...
def read_metadata(self,
items: Sequence[str]) -> Dict[str, MetadataItem]:
...
read_metadata
æ»ããªãNone
ãæ»ãå€ã®åãããã§ãªããããOptional[âŠ]
.- åŒæ°
items
ã¯äžé£ã®è¡ã§ãã ã©ã³ãã ã«ç¹°ãè¿ãããšã¯ã§ããŸããã - å±æ§
id
ãã€ãåã§ãã
çæ³çãªäžçã§ã¯ããã®ãããªåŸ®åŠãªç¹ã¯ãã¹ãŠçµã¿èŸŒã¿ã®ããã¥ã¡ã³ã (docstring) ã§èª¬æãããããšãæåŸ ãããŸãã ããããçµéšäžããã®ãããªããã¥ã¡ã³ããäœæ¥å¯Ÿè±¡ã®ã³ãŒãå ã§èŠ³å¯ãããªãããšãå€ããšããäºå®ã瀺ãäŸãæ°å€ããããŸãã ããšããã®ãããªææžãã³ãŒãå ã«ååšãããšããŠãããã®çµ¶å¯Ÿçãªæ£ç¢ºæ§ãä¿¡é Œããããšã¯ã§ããŸããã ãã®ããã¥ã¡ã³ãã¯ææ§ã§äžæ£ç¢ºã§ã誀解ãæããããå¯èœæ§ããããŸãã 倧èŠæš¡ãªããŒã ã倧èŠæš¡ãªãããžã§ã¯ãã§ã¯ããã®åé¡ãéåžžã«æ·±å»ã«ãªãå¯èœæ§ããããŸãã
Python ã¯ãããžã§ã¯ãã®åæ段éãŸãã¯äžæ段éã§ã¯åªããŠããŸãããæåãããããžã§ã¯ãã Python ã䜿çšããäŒæ¥ã¯ãããæç¹ã§ããã¹ãŠãéçåä»ãèšèªã§æžãçŽãå¿ èŠãããã?ããšããé倧ãªåé¡ã«çŽé¢ããå¯èœæ§ããããŸãã
mypy ã®ãããªåãã§ã㯠ã·ã¹ãã ã¯ãéçºè ã«åãèšè¿°ããããã®åœ¢åŒèšèªãæäŸããå宣èšãããã°ã©ã å®è£ ãšäžèŽããããšã確èªãã (ããã³ãªãã·ã§ã³ã§å宣èšã®ååšã確èªãã) ããšã«ãã£ãŠãäžèšã®åé¡ã解決ããŸãã äžè¬ã«ããããã®ã·ã¹ãã ã«ããã泚ææ·±ããã§ãã¯ãããææžã®ãããªãã®ãèªç±ã«äœ¿ããããã«ãªã£ããšèšããŸãã
ãã®ãããªã·ã¹ãã ã®äœ¿çšã«ã¯ä»ã«ãå©ç¹ãããããããã¯ãã§ã«å®å šã«èªæã§ã¯ãããŸããã
- åãã§ã㯠ã·ã¹ãã ã¯ãããã€ãã®å°ã㪠(ãŸãã¯ããã»ã©å°ãããªã) ãšã©ãŒãæ€åºã§ããŸãã å
žåçãªäŸã¯ãå€ã®åŠçãå¿ããå Žåã§ãã
None
ãŸãã¯ãã®ä»ã®ç¹å¥ãªæ¡ä»¶ã - å€ãã®å Žåãåãã§ã㯠ã·ã¹ãã ã¯ã©ã®ã³ãŒããå€æŽããå¿ èŠããããã«ã€ããŠéåžžã«æ£ç¢ºã§ãããããã³ãŒãã®ãªãã¡ã¯ã¿ãªã³ã°ãå€§å¹ ã«ç°¡çŽ åãããŸãã åæã«ããã¹ã㧠100% ã®ã³ãŒã ã«ãã¬ããžãæåŸ ããå¿ èŠããããŸãã (ãããã«ãããããã¯éåžžã¯äžå¯èœã§ã)ã åé¡ã®åå ãèŠã€ããããã«ã¹ã¿ã㯠ãã¬ãŒã¹ãæ·±ã調ã¹ãå¿ èŠã¯ãããŸããã
- 倧èŠæš¡ãªãããžã§ã¯ãã§ãã£ãŠããmypy ã¯å€ãã®å Žåãå®å šãªåãã§ãã¯ãæ°ç§ä»¥å ã«å®è¡ã§ããŸãã ãŸãããã¹ãã®å®è¡ã«ã¯éåžžãæ°åç§ãå Žåã«ãã£ãŠã¯æ°åããããŸãã åãã§ã㯠ã·ã¹ãã ã¯ããã°ã©ãã«å³åº§ã«ãã£ãŒãããã¯ãæäŸããä»äºãããéãå®è¡ã§ããããã«ããŸãã ã³ãŒã ãã¹ãã®çµæãããéãååŸããããã ãã«ãå®éã®ãšã³ãã£ãã£ãã¢ãã¯ããããã«çœ®ãæãããå£ããããä¿å®ãé£ããåäœãã¹ããäœæããå¿ èŠã¯ãããããŸããã
PyCharm ã Visual Studio Code ãªã©ã® IDE ãšãšãã£ã¿ãŒã¯ãå泚éã®åãå©çšããŠãéçºè ã«ã³ãŒãè£å®ããšã©ãŒã®åŒ·èª¿è¡šç€ºãäžè¬çã«äœ¿çšãããèšèªæ§é ã®ãµããŒããæäŸããŸãã ãããã¯ã¿ã€ãã³ã°ã®å©ç¹ã®ã»ãã®äžéšã§ãã äžéšã®ããã°ã©ãã«ãšã£ãŠãããããã¹ãŠãã¿ã€ãã³ã°ãæ¯æããäž»ãªè°è«ã§ãã ããã¯å°å ¥çŽåŸããã¡ãªãããåŸããããã®ã§ãã ãã®åã®äœ¿çšäŸã§ã¯ãmypy ã®ãããªå¥åã®åãã§ã㯠ã·ã¹ãã ã¯å¿ èŠãããŸããããmypy ã¯å泚éãšã³ãŒãã®äžè²«æ§ãä¿ã€ã®ã«åœ¹ç«ã€ããšã«æ³šæããŠãã ããã
ãã€ããŒã®èæ¯
mypy ã®æŽå²ã¯ãç§ã Dropbox ã«å ¥ç€Ÿããæ°å¹Žåã«è±åœã®ã±ã³ããªããžã§å§ãŸããŸããã ç§ã¯å士課çšã®ç 究ã®äžç°ãšããŠãéçåä»ãèšèªãšåçèšèªã®çµ±åã«æºãã£ãŠããŸããã ç§ã¯ãJeremy Siek ãš Walid Taha ã«ããã€ã³ã¯ãªã¡ã³ã¿ã« ã¿ã€ãã³ã°ã«é¢ããèšäºãšãTyped Racket ãããžã§ã¯ãã«è§ŠçºãããŸããã ç§ã¯ãå°ããªã¹ã¯ãªããããæ°çŸäžè¡ãããªãã³ãŒãããŒã¹ã«è³ããŸã§ãããŸããŸãªãããžã§ã¯ãã§åãããã°ã©ãã³ã°èšèªã䜿çšããæ¹æ³ãèŠã€ããããšããŸããã åæã«ãã©ã®ãããªèŠæš¡ã®ãããžã§ã¯ãã§ã倧ããªåŠ¥åãããå¿ èŠããªãããã«ããããšèããŸããã ãã®ãã¹ãŠã®éèŠãªéšåã¯ãåãªãã®ãããã¿ã€ã ãããžã§ã¯ããããå æ¬çã«ãã¹ããããéçåä»ãã®å®æåã«æ®µéçã«ç§»è¡ãããšããã¢ã€ãã¢ã§ããã æè¿ã§ã¯ããããã®ã¢ã€ãã¢ã¯ã»ãšãã©ãåœç¶ã®ããšãšèããããŠããŸããã2010 幎åœæãããã¯äŸç¶ãšããŠæŽ»çºã«æ€èšãããŠããåé¡ã§ããã
ç§ã®å
ã
ã®åãã§ãã¯ã®ä»äºã¯ Python ãç®çãšãããã®ã§ã¯ãããŸããã§ããã 代ããã«ãå°ããªãèªå®¶è£œãèšèªã䜿çšããŸãã
def Fib(n as Int) as Int
if n <= 1
return n
else
return Fib(n - 1) + Fib(n - 2)
end
end
ç°¡çŽ åãããæ¯åœèªã䜿çšããããšã¯ãç§åŠç 究ã§äœ¿çšãããäžè¬çãªã¢ãããŒãã§ãã ããã¯ãå®éšãè¿ éã«è¡ãããšãã§ãããšããçç±ã ãã§ãªããç 究ã«é¢ä¿ã®ãªããã®ã¯ç°¡åã«ç¡èŠã§ãããšããäºå®ãããåœãŠã¯ãŸããŸãã çŸå®äžçã®ããã°ã©ãã³ã°èšèªã¯ãè€éãªå®è£ ã䌎ã倧èŠæš¡ãªçŸè±¡ã«ãªãåŸåãããããããå®éšã®é床ãäœäžãããŸãã ãã ããåçŽåãããèšèªã«åºã¥ãçµæã¯ã©ããå°ãçãããããã«èŠããŸãããªããªãããããã®çµæãåŸãéã«ãç 究è ã¯èšèªã®å®éã®äœ¿çšã«éèŠãªèæ ®äºé ãç ç²ã«ããŠããå¯èœæ§ãããããã§ãã
Alore çšã®åãã§ãã«ãŒã¯éåžžã«ææã«èŠããŸããããAlore ã§æžãããŠããªããšèšããå®éã®ã³ãŒããè©ŠããŠãã¹ãããããšæããŸããã ç§ã«ãšã£ãŠå¹žéãªããšã«ãAlore èšèªã¯äž»ã« Python ãšåãèãæ¹ã«åºã¥ããŠããŸããã Python ã®æ§æãšã»ãã³ãã£ã¯ã¹ã§åäœã§ããããã«ã¿ã€ããã§ãã«ãŒãäœãçŽãã®ã¯ç°¡åã§ããã ããã«ããããªãŒãã³ãœãŒã¹ã® Python ã³ãŒãã§åãã§ãã¯ãè©Šãããšãã§ããŸããã ããã«ãAlore ã§æžãããã³ãŒãã Python ã³ãŒãã«å€æãããã©ã³ã¹ãã€ã©ãŒãäœæãããããã¿ã€ããã§ãã«ãŒ ã³ãŒãã®å€æã«äœ¿çšããŸããã ããã§ãPython ã®ãµãã»ãã (ãã®èšèªã®äžçš®) ããµããŒããã Python ã§æžãããåãã§ã㯠ã·ã¹ãã ãã§ããŸããã (Alore ã«ãšã£ãŠæå³ã®ããç¹å®ã®ã¢ãŒããã¯ãã£äžã®æ±ºå®ã¯ãPython ã«ã¯ããŸãé©ããŠããŸããã§ãããããã¯ãmypy ã³ãŒãããŒã¹ã®äžéšã§ä»ã§ãé¡èã§ãã)
å®éããã®æç¹ã§ã¯ãç§ã®åã·ã¹ãã ã§ãµããŒããããŠããèšèªã¯ Python ãšã¯èšããŸããã§ãããããã¯ãPython 3 ã®å泚éæ§æã®ããã€ãã®å¶éã«ãããPython ã®ããªã¢ã³ãã§ããã
Java ãš Python ãçµã¿åããããã®ã®ããã«èŠããŸããã
int fib(int n):
if n <= 1:
return n
else:
return fib(n - 1) + fib(n - 2)
åœæã®ç§ã®ã¢ã€ãã¢ã® XNUMX ã€ã¯ãåã¢ãããŒã·ã§ã³ã䜿çšããŠããã®çš®ã® Python ã C ãŸãã¯ãããã JVM ãã€ãã³ãŒãã«ã³ã³ãã€ã«ããããšã§ããã©ãŒãã³ã¹ãåäžãããããšã§ããã ã³ã³ãã€ã©ã®ãããã¿ã€ããäœæãã段éãŸã§é²ã¿ãŸããããåãã§ãã¯èªäœãéåžžã«äŸ¿å©ããã ã£ãã®ã§ããã®ã¢ã€ãã¢ã¯æŸæ£ããŸããã
ç§ã¯æçµçã«ããµã³ã¿ã¯ã©ã©ã§éå¬ããã PyCon 2013 ã§ãããžã§ã¯ããçºè¡šããããšã«ãªããŸããã ç§ã¯ãã®ããšã«ã€ããŠãPython ã®çµèº«ç¬è£è ã§ããã°ã€ãã»ãŽã¡ã³ã»ãããµã ãšã話ããŸããã 圌ã¯ç§ã«ãç¬èªã®æ§æããããŠæšæºã® Python 3 æ§æã«åºå·ãããã説åŸããŸãããPython 3 ã¯é¢æ°ã®æ³šéããµããŒãããŠãããããç§ã®äŸã¯ä»¥äžã«ç€ºãããã«æžãæããããšãã§ããçµæãšããŠéåžžã® Python ããã°ã©ã ãåŸãããŸãã
def fib(n: int) -> int:
if n <= 1:
return n
else:
return fib(n - 1) + fib(n - 2)
ããã€ãã®åŠ¥åãããå¿ èŠããããŸãã (ãŸãããŸãã«ãã®çç±ããç¬èªã®æ§æãçºæããããšã«æ³šæããããšæããŸã)ã ç¹ã«ãåœæã®èšèªã®ææ°ããŒãžã§ã³ã§ãã Python 3.3 ã¯ãå€æ°ã®ã¢ãããŒã·ã§ã³ããµããŒãããŠããŸããã§ããã ç§ã¯ãã®ãããªæ³šéã®æ§æèšèšã«ã€ããŠã®ããŸããŸãªå¯èœæ§ã«ã€ããŠé»åã¡ãŒã«ã§ Guido ãšè©±ãåããŸããã å€æ°ã«ã¯åã³ã¡ã³ãã䜿çšããããšã«ããŸããã ããã¯æå³ããç®çãæãããŸããããããé¢åã§ãã (Python 3.6 ã§ã¯ããåªããæ§æãæäŸãããŸãã)ã
products = [] # type: List[str] # Eww
åã³ã¡ã³ãã¯ãå泚éã®ãµããŒããçµã¿èŸŒãŸããŠããªã Python 2 ããµããŒãããã®ã«ã圹ç«ã¡ãŸããã
f fib(n):
# type: (int) -> int
if n <= 1:
return n
else:
return fib(n - 1) + fib(n - 2)
ããã (ããã³ãã®ä») ã®ãã¬ãŒããªãã¯å®éã«ã¯éèŠã§ã¯ãªãããšãå€æããŸãããéçåä»ãã®å©ç¹ã«ããããŠãŒã¶ãŒã¯å®ç§ãšã¯èšããªãæ§æãããã«å¿ããŠããŸããŸãã åãã§ãã¯ããã Python ã³ãŒãã§ã¯ç¹å¥ãªæ§ææ§é ã䜿çšãããŠããªããããæ¢åã® Python ããŒã«ãšã³ãŒãåŠçããã»ã¹ã¯åŒãç¶ãæ£åžžã«åäœããéçºè ãæ°ããããŒã«ãç¿åŸããã®ãã¯ããã«ç°¡åã«ãªããŸããã
ã°ã€ãããããåæ¥è«æãå®æãããåŸãDropbox ã«å ¥ç€Ÿããããç§ã説åŸããŠãããŸããã ãããããmypy ã¹ããŒãªãŒã®æãèå³æ·±ãéšåãå§ãŸããŸãã
ç¶ç¶ããã«ã¯...
芪æãªãèªè ïŒ Python ã䜿çšããŠããå Žåããã®èšèªã§éçºãããããžã§ã¯ãã®èŠæš¡ã«ã€ããŠæããŠãã ããã
åºæïŒ habr.com