3.10๋ ๊ฐ์ ๊ฐ๋ฐ ๋์ Python XNUMX ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ค์ํ ๋ฆด๋ฆฌ์ค๊ฐ ์ถ์๋์์ต๋๋ค. ์ ๋ธ๋์น๋ XNUMX๋ ๋ฐ ๋์ ์ง์๋๋ฉฐ, ์ดํ XNUMX๋ ๋ฐ ๋์ ์ทจ์ฝ์ ์ ์ ๊ฑฐํ๊ธฐ ์ํ ์์ ์ฌํญ์ด ์์ฑ๋ฉ๋๋ค.
๋์์ Python 3.11 ๋ธ๋์น์ ์ํ ํ ์คํธ๊ฐ ์์๋์์ต๋๋ค. (์๋ก์ด ๊ฐ๋ฐ ์ผ์ ์ ๋ฐ๋ผ ์ ๋ธ๋์น์ ๋ํ ์์ ์ ์ด์ ๋ธ๋์น๊ฐ ์ถ์๋๊ธฐ 3.11๊ฐ์ ์ ์ ์์๋์ด ๋ค์ ๋ฆด๋ฆฌ์ค ๋๊น์ง ์ํ ํ ์คํธ ๋จ๊ณ์ ๋๋ฌํฉ๋๋ค. ). Python XNUMX ๋ธ๋์น๋ XNUMX๊ฐ์ ๋์ ์ํ ๋ฆด๋ฆฌ์ค๋ก ์ ๊ณต๋ ์์ ์ด๋ฉฐ, ์ด ๊ธฐ๊ฐ ๋์ ์๋ก์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๊ณ ๋ฒ๊ทธ๊ฐ ์์ ๋ ๊ฒ์ ๋๋ค. ๊ทธ ํ ๋ฒ ํ ๋ฒ์ ์ XNUMX๊ฐ์ ๋์ ํ ์คํธ๋๋ฉฐ, ์ด ๊ธฐ๊ฐ ๋์ ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ๊ฐ ๊ธ์ง๋๊ณ ๋ฒ๊ทธ ์์ ์ ๋ชจ๋ ์ฃผ์๊ฐ ์ง์ค๋ฉ๋๋ค. ์ถ์ ์ ๋ง์ง๋ง XNUMX๊ฐ์ ๋์ ํด๋น ๋ธ๋์น๋ ์ต์ข ์์ ํ ์์ ์ด ์งํ๋๋ ์ถ์ ํ๋ณด ๋จ๊ณ์ ์ง์ ํ๊ฒ ๋ฉ๋๋ค.
Python 3.10์ ์๋ก์ด ์ถ๊ฐ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฝ๋ ๊ฐ๋
์ฑ์ ํฅ์์ํค๊ณ , ์์ Python ๊ฐ์ฒด์ ์ผ์น๋ฅผ ๋จ์ํํ๋ฉฐ, ๊ณ ๊ธ ์ ์ ์ ํ ๊ฒ์ฌ๋ฅผ ํตํด ์ฝ๋ ์์ ์ฑ์ ๋์ด๋ ํจํด ์ผ์น๋ฅผ ์ํ "์ผ์น" ๋ฐ "๋์๋ฌธ์" ์ฐ์ฐ์๋ฅผ ๊ตฌํํ์ต๋๋ค. ๊ตฌํ์ ์ง์ ๋ ํํ์์ ๊ฒฐ๊ณผ๋ฅผ "case" ์ฐ์ฐ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ธ๋ก์ ๋์ด๋ ํจํด ๋ชฉ๋ก๊ณผ ๋น๊ตํ๋ Scala, Rust ๋ฐ F#์์ ์ ๊ณต๋๋ "์ผ์น" ์ฐ์ฐ์์ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.
def http_error(status): ์ผ์น ์ํ: ์ผ์ด์ค 400: โ์๋ชป๋ ์์ฒญโ ๋ฐํ ์ผ์ด์ค 401|403|404: โํ์ฉ๋์ง ์์โ ๋ฐํ ์ผ์ด์ค 418: โ๋๋ ์ฃผ์ ์์ ๋๋คโ ๋ฐํ ์ผ์ด์ค _: โ๋ค๋ฅธ ๊ฒโ ๋ฐํ
๊ธฐ์กด ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋ณ์๋ฅผ ๋ฐ์ธ๋ฉํ๊ธฐ ์ํด ๊ฐ์ฒด, ํํ, ๋ชฉ๋ก ๋ฐ ์์ ์ํ์ค์ ์์ถ์ ํ ์ ์์ต๋๋ค. ์ค์ฒฉ๋ ํ ํ๋ฆฟ์ ์ ์ํ๊ณ , ํ ํ๋ฆฟ์ ์ถ๊ฐ "if" ์กฐ๊ฑด์ ์ฌ์ฉํ๊ณ , ๋ง์คํฌ("[x, y, *rest]"), ํค/๊ฐ ๋งคํ(์: {"bandwidth": b, "latency")์ ์ฌ์ฉํ ์ ์์ต๋๋ค. โ: l} ์ฌ์ ์์ "๋์ญํญ" ๋ฐ "๋๊ธฐ ์๊ฐ" ๊ฐ์ ์ถ์ถํ๊ณ , ํ์ ํ ํ๋ฆฟ(":=" ์ฐ์ฐ์)์ ์ถ์ถํ๊ณ , ํ ํ๋ฆฟ์์ ๋ช ๋ช ๋ ์์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํด๋์ค์์๋ "__match__()" ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ผ์น ๋์์ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค.
from dataclasses import dataclass @dataclass class Point: x: int y: int def whereis(point): match point: case Point(0, 0): print("Origin") case Point(0, y): print(f" Y={y}") case Point(x, 0): print(f"X={x}") case Point(): print("๋ค๋ฅธ ๊ณณ") case _: print("์ ์ด ์๋") match point: case Point(x, y) if x == y: print(f"Y=X at {x}") case Point(x, y): print(f"๋๊ฐ์ ์ ์์") RED, GREEN, BLUE = 0, 1, 2 ์์ ์ผ์น: case RED: print(โ๋นจ๊ฐ์์ด ๋ณด์ฌ์!โ) Case GREEN: print(โ์๋๋ ๋ น์์ ๋๋คโ) Case BLUE: print(โํ๋์์ด ๋๊ปด์ ธ์ :(โ)
- ์ด์ with ๋ฌธ์์ ๊ดํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ปจํ ์คํธ ๊ด๋ฆฌ์ ์ปฌ๋ ์ ์ ์ ์๋ฅผ ์ฌ๋ฌ ์ค๋ก ๋ถํ ํ ์ ์์ต๋๋ค. ๋ํ ๊ทธ๋ฃน์ ์ต์ข ์ปจํ ์คํธ ๊ด๋ฆฌ์ ๋ค์ ์ผํ๋ฅผ ๋จ๊ธธ ์๋ ์์ต๋๋ค. with ( CtxManager1() as example1, CtxManager2() as example2, CtxManager3() as example3, ): ...
- ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ๋ซํ์ง ์์ ์ค๊ดํธ ๋ฐ ๋ฐ์ดํ์ ๊ด๋ จ๋ ์ค๋ฅ์ ์ฝ๋ ์์น ๋ณด๊ณ ๊ฐ ๊ฐ์ ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ซํ์ง ์์ ์ค๊ดํธ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ค์ ๊ตฌ๋ฌธ์์ ๊ตฌ๋ฌธ ์ค๋ฅ๋ฅผ ๋ณด๊ณ ํ๋ ๋์ ์ด์ ํฌ์ธํฐ๊ฐ ์ฌ๋ ์ค๊ดํธ๋ฅผ ๊ฐ์กฐ ํ์ํ๊ณ ๋ซ๋ ๋ธ๋ก์ด ์์์ ๋ํ๋
๋๋ค. ํ์ผ "example.py", ์ฒซ ๋ฒ์งธ ์ค ์์ = {1:9, 1:18, 2:19, 2:27, 3:28, 3:29, 3:36, 4:37, ^SyntaxError: '{' ํ๋ฒ๋ ๋ซํ์ง ์์์ด
์ถ๊ฐ ํน์ ๊ตฌ๋ฌธ ์ค๋ฅ ๋ฉ์์ง ์ถ๊ฐ: ๋ธ๋ก ์๊ณผ ์ฌ์ ์ ":" ๊ธฐํธ ๋๋ฝ, ๊ดํธ๋ก ํํ์ ๊ตฌ๋ถํ์ง ์์, ๋ชฉ๋ก์์ ์ผํ ๋๋ฝ, "์ ์ธ" ๋ฐ "์ต์ข " ์์ด "try" ๋ธ๋ก ์ง์ , "= ์ฌ์ฉ ๋น๊ต์์ "= =" ๋์ f-๋ฌธ์์ด์ *-ํํ์์ ์ง์ ํฉ๋๋ค. ๋ํ ์์ ๋ถ๋ถ๋ฟ๋ง ์๋๋ผ ๋ฌธ์ ๊ฐ ์๋ ์ ์ฒด ํํ์ด ๊ฐ์กฐ ํ์๋๋๋ก ํ๊ณ ์๋ชป๋ ๋ค์ฌ์ฐ๊ธฐ์ ๊ด๋ จ๋ ์ค๋ฅ ์ปจํ ์คํธ์ ๋ํ ๋ณด๋ค ๋ช ํํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. >>> def foo(): ... if lel: ... x = 2 ํ์ผ " ", 3ํ x = 2 ^ IndentationError: 2ํ์ 'if' ๋ฌธ ๋ค์ ๋ค์ฌ์ฐ๊ธฐ๋ ๋ธ๋ก์ด ์์ด์ผ ํฉ๋๋ค.
ํจ์ ๋ด ์์ฑ๋ช , ๋ณ์๋ช ์คํ๋ก ์ธํด ๋ฐ์ํ ์ค๋ฅ์ ๊ฒฝ์ฐ, ์ฌ๋ฐ๋ฅธ ์ด๋ฆ์ผ๋ก ์ถ์ฒ์ด ์ถ๋ ฅ๋ฉ๋๋ค. >>>collections.namedtoplo ์ญ์ถ์ (๊ฐ์ฅ ์ต๊ทผ ํธ์ถ ๋ง์ง๋ง): ํ์ผ ยซ ", ๋ผ์ธ 1, in AttributeError: 'collections' ๋ชจ๋์ 'namedtoplo' ์์ฑ์ด ์์ต๋๋ค. ๋ช ๋ช ๋ ํํ์ ์๋ฏธํ์๋์?
- ๋๋ฒ๊น ๋๊ตฌ ๋ฐ ํ๋กํ์ผ๋ฌ์ ๊ฒฝ์ฐ ์คํ๋ ์ฝ๋์ ์ ํํ ์ค ๋ฒํธ์ ํจ๊ป ์ถ์ ์ด๋ฒคํธ๊ฐ ์ ๊ณต๋ฉ๋๋ค.
- 'encoding=ยปutf-8โณ' ์ต์ ์ ๋ช ์์ ์ผ๋ก ์ง์ ํ์ง ์๊ณ TextIOWrapper ๋ฐ open() ์ฒ๋ฆฌ UTF-8 ์ธ์ฝ๋ฉ ํ์ผ๊ณผ ๊ด๋ จ๋ ์ ์ฌ์ ์ค๋ฅ์ ๋ํ ๊ฒฝ๊ณ ๋ฅผ ํ์ํ๊ธฐ ์ํด sys.flags.warn_default_encoding ์ค์ ์ ์ถ๊ฐํ์ต๋๋ค(๊ธฐ๋ณธ์ ์ผ๋ก ASCII ์ธ์ฝ๋ฉ์ด ์ฌ์ฉ๋จ). . ์ ๋ฆด๋ฆฌ์ค์์๋ 'encoding="locale"' ๊ฐ์ ์ง์ ํ์ฌ ํ์ฌ ๋ก์ผ์ผ์ ๊ธฐ๋ฐ์ผ๋ก ์ธ์ฝ๋ฉ์ ์ค์ ํ๋ ๊ธฐ๋ฅ๋ ์ ๊ณตํฉ๋๋ค.
- ์ ํ ์ฃผ์์ ์ง์ ํ๋ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ ํ์ดํ ๋ชจ๋์ ์๋ก์ด ์ฐ์ฐ์๊ฐ ์ถ๊ฐ๋์ด "X | Y"๋ฅผ ์ ํํ์ฌ ์ ํ(X ์ ํ ๋๋ Y ์ ํ) ์ค ํ๋๋ฅผ ์ ํํฉ๋๋ค. def square(์ซ์: int | float) -> int | float: return number ** 2๋ ์ด์ ์ ์ง์๋ ๊ตฌ์ฑ๊ณผ ๋์ผํฉ๋๋ค: def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
- Concatenate ์ฐ์ฐ์์ ParamSpec ๋ณ์๊ฐ ํ์ดํ ๋ชจ๋์ ์ถ๊ฐ๋์์ต๋๋ค. ์ด๋ฅผ ํตํด Callable์ ์ฌ์ฉํ ๋ ์ ์ ์ ํ ๊ฒ์ฌ๋ฅผ ์ํ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค. ํ์ดํ ๋ชจ๋์ ๋ํ ์ ํ ๋ณดํธ ํจ์์ ์ฃผ์์ ๋ฌ๊ธฐ ์ํด ํน์ ๊ฐ TypeGuard๋ฅผ ์ถ๊ฐํ๊ณ ์ ํ ๋ณ์นญ์ ๋ช ์์ ์ผ๋ก ์ ์ํ๊ธฐ ์ํด TypeAlias๋ฅผ ์ถ๊ฐํฉ๋๋ค. StrCache: TypeAlias โโโโ= 'Cache[str]' # ์ ํ ๋ณ์นญ
- zip() ํจ์๋ ์ ํ์ "strict" ํ๋๊ทธ๋ฅผ ๊ตฌํํฉ๋๋ค. ์ด ํ๋๊ทธ๋ ์ง์ ๋ ๊ฒฝ์ฐ ๋ฐ๋ณต๋๋ ์ธ์์ ๊ธธ์ด๊ฐ ๋์ผํ์ง ํ์ธํฉ๋๋ค. >>> list(zip(('a', 'b', 'c'), (1, 2, 3), strict=True)) [('a', 1), ('b', 2) , ('c', 3)] >>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True)) ์ญ์ถ์ (๊ฐ์ฅ ์ต๊ทผ ํธ์ถ ๋ง์ง๋ง ): โฆ ValueError: zip() ์ธ์ 2๊ฐ ์ธ์ 1๋ณด๋ค ๊น๋๋ค.
- iter() ๋ฐ next() ํจ์์ ๋ํ ๋น๋๊ธฐ ์๋ ๋ก๊ทธ ๊ตฌํ์ ํตํด ์๋ก์ด ๋ด์ฅ ํจ์ aiter() ๋ฐ anext()๊ฐ ์ ์๋์์ต๋๋ค.
- ์์ ๊ฐ์ฒด๋ก ์์ ํ ๋ str(), bytes() ๋ฐ bytearray() ์์ฑ์์ ์์ ์ด 30-40% ๊ฐ์ํ๋์์ต๋๋ค.
- Runpy ๋ชจ๋์์ ๊ฐ์ ธ์ค๊ธฐ ์์ ์๋ฅผ ์ค์์ต๋๋ค. ๊ฐ์ ธ์จ ๋ชจ๋์ด 3๊ฐ์์ 1.4๊ฐ๋ก ์ค์ด๋ค์ด ์ด์ "python69 -m module_name" ๋ช ๋ น์ด ํ๊ท 51๋ฐฐ ๋ ๋น ๋ฅด๊ฒ ์คํ๋ฉ๋๋ค.
- LOAD_ATTR ๋ช ๋ น์ ๊ฐ๋ณ opcode์ ๋ํ ์บ์ฑ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋ฏ๋ก ์ผ๋ฐ ์์ฑ ์์ ์๋๋ฅผ ์ต๋ 36%, ์ฌ๋กฏ ์์ ์๋๋ฅผ ์ต๋ 44% ๋์ผ ์ ์์ต๋๋ค.
- "--enable-optimizations" ์ต์ ์ ์ฌ์ฉํ์ฌ Python์ ๋น๋ํ ๋ ์ด์ "-fno-semantic-interposition" ๋ชจ๋๊ฐ ํ์ฑํ๋์ด "--enable-shared" ์ต์ ์ ์ฌ์ฉํ์ฌ ๋น๋ํ๋ ๊ฒ์ ๋นํด ์ธํฐํ๋ฆฌํฐ ์๋๋ฅผ ์ต๋ 30%๊น์ง ๋์ผ ์ ์์ต๋๋ค. " ์ต์ .
- hashlib ๋ฐ ssl ๋ชจ๋์ OpenSSL 3.0.0์ ๋ํ ์ง์์ ์ถ๊ฐํ์ผ๋ฉฐ 1.1.1๋ณด๋ค ์ด์ ๋ฒ์ ์ OpenSSL ์ง์์ ์ค๋จํ์ต๋๋ค.
- ์ด์ ๋ถ๊ธฐ์์ PEG(Parsing Expression Grammar) ํ์๋ก ๋์ฒด๋ ์ด์ ํ์๊ฐ ์ ๊ฑฐ๋์์ต๋๋ค. ํฌ๋งทํฐ ๋ชจ๋์ด ์ ๊ฑฐ๋์์ต๋๋ค. ๋ฃจํ ๋งค๊ฐ๋ณ์๊ฐ asyncio API์์ ์ ๊ฑฐ๋์์ผ๋ฉฐ, ์ด์ ์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์๋ ๋ฉ์๋๋ ์ ๊ฑฐ๋์์ต๋๋ค. Py_UNICODE* ๋ฌธ์์ด์ ์กฐ์ํ๋ Py_UNICODE_str* ํจ์๊ฐ ์ ๊ฑฐ๋์์ต๋๋ค.
- distutils ๋ชจ๋์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ผ๋ฉฐ Python 3.12์์ ์ ๊ฑฐ๋ ์์ ์ ๋๋ค. distutils ๋์ setuptools, Packaging, platform, Shutil, subprocess ๋ฐ sysconfig ๋ชจ๋์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. PyUnicodeObject์ wstr ๊ตฌ์กฐ๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ผ๋ฉฐ ์ ๊ฑฐ๋ ์์ ์ ๋๋ค.
์ถ์ฒ : opennet.ru