Python 3.5 ë²ì ìë ë€ì곌 ê°ì íììŒë¡ IDEì ìœë ê°ë ì±ì ëìì ì€ ì ìëë¡ íšìì ìžìì ë°íê°ì ëí íì íížê° ì²ììŒë¡ ëì ëìë€.
def greeting(name: str) -> str:
return 'Hello ' + name
ê·žëŠ¬ê³ íì ëìš 3.6 ë²ì ììë ìžìì ë°íê° ë§ìŽ ìëëŒ ë³ììë íì ííž íêž°ê° ê°ë¥íŽì¡ë€.
def greeting(name: str) -> str:
s: str = 'Hello ' + name
return s
íì ííž êž°ë¥ì íì íìì êŽí íì€ êµ¬ë¬žì ì ê³µíê³ , ë ì¬ìŽ ì ì ë¶ì곌 늬í©í ë§ ë° íì ì 볎륌 ì¶ë¡ íë ê²ì ëí ëìì 죌Ʞ ìíŽ ë§ë€ìŽì¡ë€.
ì륌 ë€ìŽ ììíì§ ëª»í íì ìŽ ë³ìì í ë¹ë ëë íšìì ì ë¬ë ë IDEë ì ì ê²ì¬êž°ë ìœê² ì€ë¥ëŒê³ íëší ì ììê²ìŽë€. ëí ë€ë¥ž ì¬ëìŽë, ìœê² ììŽë²ëŠŽê² ê°ì ìœëì ìŽë€ íì ìŽ êž°ëëëì§ ìœê² ìë €ì€ ì ìë€.
íì íížë ì ì í ë구ì íšê» ì¬ì©ë ê²œì° ì ì ìžìŽê° ê°ì§ë ì¥ì ìž íì ìì€í ì ê²¬ê³ íšì ëì ìžìŽë¡ìš ì¡°êžìŽëŒë ë°ëŒì¡ì ì ìëë¡ ëìì€ ê²ìŽë€.
íì ííž êž°ë¥ì ë§ ê·žëë¡ íì "ííž" êž°ë¥ìŒ ë¿ìŽë€. íì íížë ì ì ê²ì¬êž°ì IDE륌 ì¬ì©íë©° ìœëì ì§ì ëìŽêž° ìíŽ ì¬ì© ë ì ììŒë ê²°ìœ ë°íìì ìí¥ì ëŒì¹ì§ ìëë€. ì ìíì ê°ì§ ë³ìì 묞ììŽ íì ì íížë¡ ìì±íŽ ëëë€ê³ íŽì íìŽì¬ì ìë¬Žë° ë¬žì ê° ìë€ê³ ìê°íì§ ìì ê²ìŽë€.
ì¬ì€ íì íížë ìœëì ë¶ì 죌ìì ê°ê¹ë€. ë ì€ížë§ì docì ì¬ì©íì¬ ê°ì žì¬ ì ìë ê² ì²ëŒ íì ííž ì 볎 ëí annotationsìì±ì íµíì¬ íì íížë¥Œ ê°ì žì¬ ì ìë€.
íìŽì¬ì íì íížë typing 몚ëì ì¬ì©íì¬ ìì±í ì ìë€.
뚌ì íšì ì ìžë¶ì êŽí íì íížë ìžì ë€ì ìœë¡ ì ë¶ì¬ì ìžìì íì íížë¥Œ ë¶ìŽê³ , êŽíž ë€ ìœë¡ ì ì "-> íì " ì ë¶ìŽë íììŒë¡ ë°íê°ì ëí íì íížë¥Œ ì§ì í ì ìë€.
def make_post(title: str, author_id: int=0) -> str:
...
ë³ìì íì ì íšì ìžìì ë¹ì·í íììŒë¡ íížë¥Œ ë¶ìŒ ì ìë€.
num: int = 34 # int type
string: str = "Hello types!" # str type
test: Test = Test(num) # class "Test" type
íŽëì€ ë©€ë² ë³ìë ë³ìì ë¹ì·íë€.
class A:
x: int # int type
y: str # str type
z: float # float type
def __init__(self, x: int, y: str, z: float):
self.x = x
self.y = y
self.z = z
íìŽí 몚ëìë í¹ë³í íì
ë€ ëªê°ì§ê° 졎ì¬íë€.
ê·ž ì€ Anyì NoReturnì ëíŽ ìê°íë€.
Anyë ë§ ê·žëë¡ ëªšë íì ì íì©íë€.
x: Any = 3 # ëë€
y: Any = "anyone" # ëë€
NoReturnì 늬íŽìŽ ëëê²ìŽ ìëëŒ ììžë¥Œ ë°ììí€ë ë±ì 겜ì°ì ì¬ì©íë€.
from typing import NoReturn
def stop() -> NoReturn:
raise RuntimeError('no way')
íì ë³ì¹ì ê°ëšíë€. íì ì ì ë³ìì ëì í멎 ê·ž ë³ìë íì ë³ì¹ìŒë¡ìš êž°ë¥íë€. ë€ìì ê°ëší ìììŽë€.
from typing import List
url_ls = List[str] # List with str type
crawling_result = List[str] # List with str type
def crawler(urls: url_ls) -> crawling_result:
...
ë¬Œë¡ ëì± ë³µì¡í íì ë³ì¹ë ë§ë€ ì ìë€. ìŽ ìœëë ì ë€ëŠì íì©í ê²ìŒë¡ ì¶íì ë ìì볌 ê²ìŽë€.
from typing import TypeVar, Tuple, Iterable
T = TypeVar('T', int, float)
Vector = Iterable[Tuple[T, T]]
def inproduct(v: Vector[T]) -> T: # 벡í°ì ëŽì
return sum(x*y for x, y in v)
íšì륌 ìì±íë€ ë³Žë©Ž íšì륌 ë°ííë íšì ëë íšì륌 íšì륌 ìì±íê² ë ê²ìŽë€. ëë ë³ìì íšì ê°ì²Žë¥Œ í ë¹í ìë ìë€. ìŽë¬í ê°ì²Žë¡ìšì íšìì íì ì Callableì ì¬ì©íì¬ ííí ì ìë€.
from typing import Callable
def callback_loader(callback: Callable[[float], int]) -> int:
# floatì ìžìë¡ ë°ì int íì ë°ííë ìœë°±ì ìžìë¡ ë°ëë€.
return callback(3.7)
from typing import Callable
def closure(txt: str) -> Callable[[], str]:
# ì묎 ìžìë ë°ì§ ìê³ str íì ë°ííë íšì륌 ë°ííë€.
def inner_func() -> str:
return txt
return inner_func
from typing import Callable
def func(txt: str) -> str:
return txt
x: Callable[[str], str] = func # íšì ê°ì²Žë¥Œ í ë¹
íìŽì¬ì íì íížë í¹ì í íŽëì€ëŒë ê² ëí ëª ìí ì ìë€.
class A:
def print_all() -> None:
...
def print_class(cls_obj: A) -> None:
cls_obg.print_all()
a = A()
print_class(a) # ì ì ê²ì¬ê° íµê³Œí ê²ìŽë€.
ê·žë°ë° ë§ìœ ììë°ì íì íŽëì€ë ë°ìë€ìŽë €ë©Ž ìŽë»ê² íŽìŒ í ê¹?
class A:
def print_all() -> None:
...
class B(A):
...
def print_class(cls_obj: A) -> None:
cls_obg.print_all()
b = B()
print_class(b) # ì ì ê²ì¬êž°ë íì
ìŽ ìŒì¹íì§ ìëë€ê³ ê²œê³ í ê²ìŽë€.
ìŽëŽ ë륌 ìíŽ Type[C] 묞ë²ìŽ ì€ë¹ëìŽ ìë€. (Cë íŽëì€ë¥Œ ëíëžë€) ê·žë¥ C륌 íì ìŒë¡ ì¬ì©í멎 Cì ìžì€íŽì€ë§ì ë°ìë€ìŽì§ë§ Type[C]ì ì¬ì©í멎 ìì íŽëì€ë¥Œ ììë°ì 몚ë íì íŽëì€ ëí íì©íê² ëë€.
from typing import Type
class A:
def print_all() -> None:
...
class B(A):
...
def print_class(cls_obj: Type[A]) -> None:
# Aì íì íŽëì€ë íì©
cls_obg.print_all()
b = B()
print_class(b) # ì ì ê²ì¬ê° íµê³Œí ê²ìŽë€.
ë°ìŽí° íìì ì졎íì§ ìê³ ìžì, ë³ì ëë ë°íê° ë±ìŽ ì¬ë¬ ë€ë¥ž ë°ìŽí° íì ë€ì ê°ì§ ì ìë ë°©ìì ì ë€ëŠìŽëŒê³ íë€.
íìŽì¬ì íì ííž êž°ë¥ììë ì ë€ëŠ ííìŽ ê°ë¥íë€.
ë€ìì ê°ëší ì ë€ëŠì ì¬ì©í íŽëì€ì ì ìžê³Œ ì¬ì©ì ìììŽë€.
from typing import TypeVar, Generic, List
T = TypeVar('T')
class C(Generic[T]):
def __init__(self) -> None:
self.ls: List[T] = []
# T íì
ì 늬ì€ížë¥Œ ìŽêž°ííë€
def put(item: T) -> None:
# T íì
ì ìžìë¡ ë°ëë€
self.ls.append(item)
def get(index: int) -> T:
# T íì
ì ë°ííë€
return self.ls[index]
c = C[str]() # íì
ì strë¡ ê²°ì ëë€
c.put("hello") # ìë¬Žë° ë¬žì ê° ìë€
c.get(0) # str íì
ì ê°ì ë°íí ê²ìŒë¡ êž°ëëë€.
íšììë ì ë€ëŠì ì ì©í ì ìë€.
from typing import TypeVar, Sequence
T = TypeVar('T')
def first(sqnce: Sequence[T]) -> T:
# ì
ë ¥ë°ì ìíì€ ê°ì²Žì íì
ì ë°ëŒ ë°í íì
ë ê²°ì ëë€.
return sqnce[0]
ì ë€ëŠê³Œ ë¬ëЬ íì© ê°ë¥í íì
ì ë²ìê° ì íŽì ž ìë€ë©Ž Unionì ì¬ì©í ì ìë€.
Unionì ì íë íì
ì ì§í©ìŽë€. UnionìŽ íì
íížë¡ ì¬ì©ëë€ë©Ž íŽë¹ ë³ì-ìžì-늬íŽê°ì íŽë¹ Unionì ìíŽìë íì
ì ê°ì§ì ìë€ê³ ííëë€
from typing import Union
...
def dispencer(select: int) -> Union[Coke, Soda]:
# Coke륌 늬íŽí ìë ìê³ , Soda륌 늬íŽí ìë ìë€.
...
ì€ë²ë¡ë©ìŽë ê°ì íšì ìŽëŠì ê°ì§ì§ë§ ìžìê° ë€ë¥ž íšì륌 ì ìží ì ìë ë°©ë²ì ë§íë€. ë¬Œë¡ íìŽì¬ì ì€ë²ë¡ë©ì ì§ìíì§ ìì§ë§ typing 몚ëì @overload ë°ìœë ìŽí°ë¥Œ ì¬ì©íì¬ ì€ë²ë¡ë©ìŽ ê°ë¥í ê²ì²ëŒ 볎ìŽê² í ì ìë€.
ì€ë²ë¡ë ë°ìœë ìŽí°ë¥Œ ì¬ì©íêž° ìíŽìë ì€ë²ë¡ë ë°ìœë ìŽí°ë¥Œ ì ì©í íšì ìíì ë§ë€ê³ , ì€ë²ë¡ë ë°ìœë ìŽí°ê° ì ì©ëì§ ìì 볞첎륌 ë§ë€ìŽìŒ íë€.
ì€ë²ë¡ë ë°ìœë ìŽí°ê° ì ì©ë ìœë륌 ì€íììŒ ë³Žë©Ž ë°ìœë ìŽí°ê° ìë ë³žì²Žë§ ì€íëë€.
from typing import overload, Union
class MyIter:
@overload
def __getitem__(self, i: int) -> int: ...
@overload
def __getitem__(self, s: slice) -> bytes: ...
def __getitem__(self, x: Union[int, slice]) -> Union[int, bytes]:
if isinstance(x, int):
pass
elif isinstance(x, slice):
pass
íì¬(3.7 ë²ì ê¹ì§)ì íì ííž êž°ë¥ì ë€ì곌 ê°ì ìœë륌 ì¬ì©í ì ìë€. íížë¥Œ íê°í ë ìì§ ì ìëì§ ìì íì ì ì¬ì©í ì ìêž° ë묞ìŽë€.
class Node:
def __init__(self, right: Node, left: Node):
# ìì§ Nodeì ì ìê° ëëì§ ìì ì€ë¥ê° ë°ìíë€.
self.right = right
self.left = left
ìŽ ë¬žì ìë ëê°ì§ì íŽê²° ë°©ììŽ ì¡Žì¬íë€. íì
ì ì륌 ëì€ì íìží ììë 묞ììŽ ëŠ¬í°ëŽë¡ ì²ëЬíëê°, from __future__ import annotations
구묞(íìŽì¬ 3.7 ë§ íŽë¹)ì íìŒ ë§š ìì ìœì
íì¬ íì
íížì ëí íê°ë¥Œ lazy íê² íšìŒë¡ìš íŽê²°í ì ìë€.
class Node:
def __init__(self, right: 'Node', left: 'Node'):
self.right = right
self.left = left
from __future__ import annotations
class Node:
def __init__(self, right: Node, left: Node):
self.right = right
self.left = left
ì ë€ë ìŽí° íšìë Generator[yield_type, send_type, return_type]
ì íììŒë¡ íì
íížë¥Œ ê°ì§ ì ìë€.
def echo_round() -> Generator[int, float, str]:
res = yield
while res:
res = yield round(res)
return 'OK'
ê·žë¬ë ë¹ëêž° íšì(ìœë£šíŽ)ì ì¡°êž í¹ë³íë€. ë¹ëêž° íšì륌 íë ì ìžíŽ ë³Žì.
async def test():
return "Hello async!"
ë§ìœ ìŽ íšìê° ë¬Žì¡°ê±Ž await ëë€ë©Ž ìŽ íšìì 결곌ë str íì
ì ê°ì§ê² ë ê²ìŽì§ë§ await ëì§ ìëë€ë©Ž ìœë£šíŽ ì첎륌 ë°ííê² ë ê²ìŽë€.
ë¹ëêž° íšìì íì
íížë ë€ì곌 ê°ìŽ ì¬ì©íì.
from typing import Corutine # Generatorì ì¬ì©ë²ì ê°ë€.
async def test() -> Corutine[Any, Any, str]:
return "Hello async!"
async def run():
res: Corutine[Any, Any, str] = test()
res_2: str = await test()
ìŽë¥Œ ì©ì©íŽì ë¹ëêž° íšì ê°ì²Žë¥Œ ííí ìë ìë€
from typing import Corutine, Callable
async def test() -> Corutine[Any, Any, str]:
return "Hello async!"
x: Callable[[], Corutine[Any, Any, str]] = test
ì¬êž°ê¹ì§ íìŽì¬ì íì íížì ëíŽ ìì볎ìë€. PEP 484ìì ë°íë¯ íì íížë íìŽì¬ìŽ ì ì ìžìŽë¡ ì°ìŽêž° ìí ê²ë ìëê³ , íìë ìëë€. ê·žë¬ë ì ì í ë구ì ê°ìŽ ì¬ì©íë€ë©Ž ì ì 컀ì§ë ìœë륌 ë§ë€ìŽ ê°ë ê²ì ëìì€ ì ìì ê²ìŽë€.
ìŽ êžì ìììì íëœ íì Anthony Shawì Has the Python GIL been slain? ì ë²ìí êžì ëë€. ìœê°ì ìììŽ ììŒë©° ì€ì, ì€í, ìŽìí ë²ììŽ ìë€ë©Ž ìë €ì£Œìžì :) 2003ë ìŽ, ìží ì "íìŽíŒì€ë ë©" êž°ì ì í¬íší 3GHz íŽëì ì Pentium 4 "HT" íë¡ìžì륌 ì¶ìíìµëë€. ëªë ëì Intel곌 A...
ë°ìŽí°ë² ìŽì€ ìí¬ëŠ¿ ìì§ìŽë? 볌ížë ëšìí ìížíë KV ì€í ìŽ ìŽìžìë ë§ì ìí¬ëŠ¿ ìì§ì ì ê³µíë€. ê·žì€ì ë°ìŽí°ë² ìŽì€ ìí¬ëŠ¿ ìì§ìŽëŒë ê²ìŽ ìë€. ë°ìŽí°ë² ìŽì€ë ëë¶ë¶ì êž°ì ìì ì죌 ì€ìí ìì¹ë¥Œ ì°šì§íë€. ë€ìì 겜ì°ë¥Œ íë² ìê°íŽ ë³Žëë¡ íì. ë°ìŽí°
PEP 484ì ëí ìê° Python 3.5 ë²ì ìë ë€ì곌 ê°ì íììŒë¡ IDEì ìœë ê°ë ì±ì ëìì ì€ ì ìëë¡ íšìì ìžìì ë°íê°ì ëí íì íížê° ì²ììŒë¡ ëì ëìë€. ë§ì¹ë©Žì ì¬êž°ê¹ì§ íìŽì¬ì íì íížì ëíŽ ìì볎ìë€. PEP 484ìì ë°íë¯ íì íížë íìŽì¬ìŽ ì ì ìžìŽë¡ ì°ìŽêž° ìí ê²ë ìëê³ , íìë ìëë€. ê·žë¬...
ìŽì ì ë í¬ì€ížìì 볌ížë¥Œ ì€ì¹-ì€ì íê³ ížëЬíê² ì¬ì©íêž° ìí UIê¹ì§ íì±í íë€. ìŽë² í¬ì€ížììë 볌ížì ì ê·Œ ê¶íì ì ìŽíë ì ì± ì€ì ì ëíŽ ìì볌 ì°šë¡ë€. ë€ì ë§íì§ë§ 볌ížë 몚ë ì€ìí ì 볎륌 ëŽê³ ìë ì죌 ì€ìí ìë¹ì€ìŽë€. ë¹ì°í 몚ë ì¬ëìŽ ë£šíž ê¶íì ê°ì§ê³ 몚ë ì 볎ì ììžì€íê³ , ë³ê²œíë ê²ì ì죌 ìííë€. ë°ëŒì 볌ížë ...
UI? 0.10ë²ì ì ë ê¹ì§ë 볌ížì Ʞ볞ì ìŒë¡ ì¹ uiê° ì ê³µëì§ ììë€ê³ íë€. ê·žëì react륌 êž°ë°ìŒë¡ íë ë¹ê³µì vault ui륌 ìŽì©íŽ ì¹ ìì 볌ížë¥Œ ì¬ì©íê³ ê³µì uiê° ëìš ì§êžë ìµìíš ë묞ì ë¹ê³µì ui륌 ì¬ì©íê³ ìë€ í¹íë ë¹ê³µì uiê° JSONí¬ë§·í êž°ë¥ë±ì ì ì ê³µíê³ ë³Œíž ìë²ìì ìëëëê² ìëëŒ ë³Œížë ë°ë¡ ëì ...