4๋งŒ ์ค„์˜ Python ์ฝ”๋“œ๋ฅผ ์œ ํ˜• ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. 1 ๋ถ€

์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” Dropbox๊ฐ€ Python ์ฝ”๋“œ์˜ ์œ ํ˜• ์ œ์–ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž๋ฃŒ ๋ฒˆ์—ญ์˜ ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์„ ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค.

4๋งŒ ์ค„์˜ Python ์ฝ”๋“œ๋ฅผ ์œ ํ˜• ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. 1 ๋ถ€

Dropbox๋Š” Python์œผ๋กœ ๋งŽ์€ ๊ฒƒ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์™€ ๋ฐ์Šคํฌํ†ฑ ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋‘์— ๋งค์šฐ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ Go, TypeScript ๋ฐ Rust๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€๋งŒ Python์ด ์šฐ๋ฆฌ์˜ ์ฃผ์š” ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ทœ๋ชจ์™€ ์ˆ˜๋ฐฑ๋งŒ ์ค„์˜ Python ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ๋•Œ ๊ทธ๋Ÿฌํ•œ ์ฝ”๋“œ์˜ ๋™์  ํƒ€์ดํ•‘์ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ดํ•ด๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ๋…ธ๋™ ์ƒ์‚ฐ์„ฑ์— ์‹ฌ๊ฐํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด mypy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ •์  ์œ ํ˜• ๊ฒ€์‚ฌ๋กœ ์ ์ง„์ ์œผ๋กœ ์ „ํ™˜ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•„๋งˆ๋„ Python์—์„œ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋…๋ฆฝ ์‹คํ–‰ํ˜• ์œ ํ˜• ๊ฒ€์‚ฌ ์‹œ์Šคํ…œ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Mypy๋Š” ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์ด๋ฉฐ ์ฃผ์š” ๊ฐœ๋ฐœ์ž๋Š” Dropbox์—์„œ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค.

Dropbox๋Š” ์ด๋Ÿฌํ•œ ๊ทœ๋ชจ๋กœ Python ์ฝ”๋“œ์— ์ •์  ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ๊ตฌํ˜„ํ•œ ์ตœ์ดˆ์˜ ํšŒ์‚ฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. 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๋Š” ์ข…์ข… ๋ช‡ ๋ถ„์˜ XNUMX์ดˆ ๋งŒ์— ์ „์ฒด ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ ์‹คํ–‰์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆ˜์‹ญ ์ดˆ ๋˜๋Š” ๋ช‡ ๋ถ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์œ ํ˜• ๊ฒ€์‚ฌ ์‹œ์Šคํ…œ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ์ฆ‰๊ฐ์ ์ธ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๊ณ  ์ž‘์—…์„ ๋” ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Š” ๋” ์ด์ƒ ์ฝ”๋“œ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ๋” ๋นจ๋ฆฌ ์–ป๊ธฐ ์œ„ํ•ด ์‹ค์ œ ์—”ํ„ฐํ‹ฐ๋ฅผ ๋ชจ์˜ ๊ฐ์ฒด์™€ ํŒจ์น˜๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊นจ์ง€๊ธฐ ์‰ฝ๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

PyCharm ๋˜๋Š” Visual Studio Code์™€ ๊ฐ™์€ IDE ๋ฐ ํŽธ์ง‘๊ธฐ๋Š” ์œ ํ˜• ์ฃผ์„์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ฝ”๋“œ ์™„์„ฑ, ์˜ค๋ฅ˜ ๊ฐ•์กฐ ํ‘œ์‹œ ๋ฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์–ธ์–ด ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์ง€์›์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ๋“ค์€ ํƒ€์ดํ•‘์˜ ์ด์  ์ค‘ ์ผ๋ถ€์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ๋Š” ์ด ๋ชจ๋“  ๊ฒƒ์ด ํƒ€์ดํ•‘์„ ์„ ํ˜ธํ•˜๋Š” ์ฃผ์š” ๋…ผ๊ฑฐ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ตฌํ˜„ ์งํ›„์— ์ด์ ์ด ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ ํ˜•์— ๋Œ€ํ•œ ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€์—๋Š” mypy์™€ ๊ฐ™์€ ๋ณ„๋„์˜ ์œ ํ˜• ๊ฒ€์‚ฌ ์‹œ์Šคํ…œ์ด ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ 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์˜ ๊ตฌ๋ฌธ ๋ฐ ์˜๋ฏธ ์ฒด๊ณ„์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก typechecker๋ฅผ ๋‹ค์‹œ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ถฉ๋ถ„ํžˆ ์‰ฌ์› ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์˜คํ”ˆ ์†Œ์Šค 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)

๋‹น์‹œ ๋‚ด ์•„์ด๋””์–ด ์ค‘ ํ•˜๋‚˜๋Š” ์œ ํ˜• ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ Python์„ C ๋˜๋Š” ์•„๋งˆ๋„ JVM ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ ํ”„๋กœํ† ํƒ€์ž…์„ ์ž‘์„ฑํ•˜๋Š” ๋‹จ๊ณ„์— ์ด๋ฅด๋ €์ง€๋งŒ ์œ ํ˜• ๊ฒ€์‚ฌ ์ž์ฒด๊ฐ€ ๋งค์šฐ ์œ ์šฉํ•ด ๋ณด์˜€๊ธฐ ๋•Œ๋ฌธ์— ์ด ์•„์ด๋””์–ด๋ฅผ ํฌ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” Santa Clara์—์„œ ์—ด๋ฆฐ PyCon 2013์—์„œ ๋‚ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐœํ‘œํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ์ž์• ๋กœ์šด ์ข…์‹  ๋…์žฌ์ž ๊ท€๋„ ๋ฐ˜ ๋กœ์„ฌ๊ณผ๋„ ์ด์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ๋‚ด ์ž์‹ ์˜ ๊ตฌ๋ฌธ์„ ๋ฒ„๋ฆฌ๊ณ  ํ‘œ์ค€ 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 ๋„๊ตฌ ๋ฐ ์ฝ”๋“œ ์ฒ˜๋ฆฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณ„์† ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒˆ ๋„๊ตฌ๋ฅผ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Guido๋Š” ์ œ๊ฐ€ ๋Œ€ํ•™์› ๋…ผ๋ฌธ์„ ๋งˆ์นœ ํ›„ Dropbox์— ํ•ฉ๋ฅ˜ํ•˜๋„๋ก ์„ค๋“ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ mypy ์ด์•ผ๊ธฐ์˜ ๊ฐ€์žฅ ํฅ๋ฏธ๋กœ์šด ๋ถ€๋ถ„์ด ์‹œ์ž‘๋˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.

๊ณ„์† ๋  ...

๋…์ž ์—ฌ๋Ÿฌ๋ถ„! Python์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ์–ธ์–ด๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ์— ๋Œ€ํ•ด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

4๋งŒ ์ค„์˜ Python ์ฝ”๋“œ๋ฅผ ์œ ํ˜• ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. 1 ๋ถ€
4๋งŒ ์ค„์˜ Python ์ฝ”๋“œ๋ฅผ ์œ ํ˜• ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. 1 ๋ถ€

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€