3.11๋ ๊ฐ์ ๊ฐ๋ฐ ๋์ Python XNUMX ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ค์ํ ๋ฆด๋ฆฌ์ค๊ฐ ์ถ์๋์์ต๋๋ค. ์ ๋ธ๋์น๋ XNUMX๋ ๋ฐ ๋์ ์ง์๋๋ฉฐ, ์ดํ XNUMX๋ ๋ฐ ๋์ ์ทจ์ฝ์ ์ด ์๋ ํจ์น๊ฐ ํ์ฑ๋ ์์ ์ ๋๋ค.
๋์์ Python 3.12 ๋ธ๋์น์ ์ํ ํ ์คํธ๊ฐ ์์๋์์ต๋๋ค. (์๋ก์ด ๊ฐ๋ฐ ์ผ์ ์ ๋ฐ๋ผ ์ ๋ธ๋์น์ ๋ํ ์์ ์ ์ด์ ๋ธ๋์น๊ฐ ์ถ์๋๊ธฐ 3.12๊ฐ์ ์ ์ ์์๋์ด ๋ค์ ๋ฆด๋ฆฌ์ค ๋๊น์ง ์ํ ํ ์คํธ ๋จ๊ณ์ ๋๋ฌํฉ๋๋ค. ). Python XNUMX ๋ธ๋์น๋ XNUMX๊ฐ์ ๋์ ์ํ ๋ฆด๋ฆฌ์ค๋ก ์ ๊ณต๋ ์์ ์ด๋ฉฐ, ์ด ๊ธฐ๊ฐ ๋์ ์๋ก์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๊ณ ๋ฒ๊ทธ๊ฐ ์์ ๋ ๊ฒ์ ๋๋ค. ๊ทธ ํ ๋ฒ ํ ๋ฒ์ ์ XNUMX๊ฐ์ ๋์ ํ ์คํธ๋๋ฉฐ, ์ด ๊ธฐ๊ฐ ๋์ ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ๊ฐ ๊ธ์ง๋๊ณ ๋ฒ๊ทธ ์์ ์ ๋ชจ๋ ์ฃผ์๊ฐ ์ง์ค๋ฉ๋๋ค. ์ถ์ ์ ๋ง์ง๋ง XNUMX๊ฐ์ ๋์ ํด๋น ๋ธ๋์น๋ ์ต์ข ์์ ํ ์์ ์ด ์งํ๋๋ ์ถ์ ํ๋ณด ๋จ๊ณ์ ์ง์ ํ๊ฒ ๋ฉ๋๋ค.
Python 3.11์ ์๋ก์ด ์ถ๊ฐ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํด ์๋นํ ์์
์ด ์ํ๋์์ต๋๋ค. ์๋ก์ด ๋ถ๊ธฐ์๋ ํจ์ ํธ์ถ์ ๊ฐ์ํ ๋ฐ ์ธ๋ผ์ธ ๋ฐฐํฌ, ์ผ๋ฐ์ ์ธ ์์
(x+x, x*x, xx, a[i], a[i] = z, f( arg) C( arg), o.method(), o.attr = z, *seq) ๋ฐ Cinder ๋ฐ HotPy ํ๋ก์ ํธ์์ ์ค๋นํ ์ต์ ํ. ๋ก๋ ์ ํ์ ๋ฐ๋ผ ์ฝ๋ ์คํ ์๋๊ฐ 10~60% ์ฆ๊ฐํฉ๋๋ค. ํ๊ท ์ ์ผ๋ก pyperformance ํ
์คํธ ์ค์ํธ๋ฅผ ํต๊ณผํ ๋์ ์ฑ๋ฅ์ 25% ์ฆ๊ฐํ์ต๋๋ค.
๋ฐ์ดํธ์ฝ๋ ์บ์ฑ ๋ฉ์ปค๋์ฆ์ด ์ฌ์ค๊ณ๋์ด ์ธํฐํ๋ฆฌํฐ ์์ ์๊ฐ์ด 10-15% ๋จ์ถ๋์์ต๋๋ค. ์ฝ๋์ ๋ฐ์ดํธ์ฝ๋๊ฐ ์๋ ๊ฐ์ฒด๋ ์ด์ ์ธํฐํ๋ฆฌํฐ์ ์ํด ์ ์ ์ผ๋ก ํ ๋น๋๋ฏ๋ก ์บ์์์ ์ถ์ถ๋ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์ญ๋ง์ฌ๋งํ๊ณ ๋์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐฐ์นํ๊ธฐ ์ํด ์ฝ๋๋ก ๊ฐ์ฒด๋ฅผ ๋ณํํ๋ ๋จ๊ณ๊ฐ ํ์ํ์ง ์์ต๋๋ค.
- ์ง๋จ ๋ฉ์์ง์ ํตํ ์ถ์ ์ ํ์ํ ๋ ์ค๋ฅ๋ฅผ ์ผ์ผํจ ํํ์ ๋ํ ์ ๋ณด๊ฐ ์ ๊ณต๋ฉ๋๋ค(์ด์ ์๋ ์ค๋ฅ๋ฅผ ์ผ์ผํจ ์ค์ ๋ถ๋ถ์ ์์ธํ ์ค๋ช ํ์ง ์๊ณ ํด๋น ์ค๋ง ๊ฐ์กฐ ํ์ํ์ต๋๋ค). ํ์ฅ๋ ์ถ์ ์ ๋ณด๋ API๋ฅผ ํตํด ๊ฒ์ํ ์๋ ์์ผ๋ฉฐ codeobject.co_positions() ๋ฉ์๋ ๋๋ PyCode_Addr2Location() C API ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ณ ๋ฐ์ดํธ์ฝ๋ ๋ช ๋ น์ ์์ค ์ฝ๋์ ํน์ ์์น์ ๋งคํํ๋ ๋ฐ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ์ค์ฒฉ๋ ์ฌ์ ๊ฐ์ฒด, ๋ค์ค ํจ์ ํธ์ถ ๋ฐ ๋ณต์กํ ์ฐ์ ํํ์๊ณผ ๊ด๋ จ๋ ๋๋ฒ๊น ๋ฌธ์ ๊ฐ ํฌ๊ฒ ๋จ์ํ๋์์ต๋๋ค. ์ญ์ถ์ (๊ฐ์ฅ ์ต๊ทผ ํธ์ถ ๋ง์ง๋ง): ํ์ผ "calculation.py", 54ํ, ๊ฒฐ๊ณผ = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: XNUMX์ผ๋ก ๋๋๊ธฐ
- ์์ธ ๊ทธ๋ฃน์ ๋ํ ์ง์์ด ์ถ๊ฐ๋์ด ํ๋ก๊ทธ๋จ์ ๋์์ ์ฌ๋ฌ ๊ฐ์ง ์์ธ๋ฅผ ์์ฑํ๊ณ ์ฒ๋ฆฌํ ์ ์๋ ๊ธฐ๋ฅ์ด ์ ๊ณต๋ฉ๋๋ค. ์๋ก์ด ์ ํ์ ์์ธ ExceptionGroup ๋ฐ BaseExceptionGroup์ ์ฌ๋ฌ ์์ธ ๋ฐ ํด๋น ๊ณต๋ ํธ์ถ์ ๊ทธ๋ฃนํํ๊ธฐ ์ํด ์ ์๋์์ผ๋ฉฐ ๊ทธ๋ฃน์์ ์์ธ๋ฅผ ๋ถ๋ฆฌํ๊ธฐ ์ํด "์ ์ธ*"๋ผ๋ ํํ์ด ์ถ๊ฐ๋์์ต๋๋ค.
- add_note() ๋ฉ์๋๊ฐ BaseException ํด๋์ค์ ์ถ๊ฐ๋์์ต๋๋ค. ์ด๋ฅผ ํตํด ์์ธ์ ํ ์คํธ ๋ฉ๋ชจ๋ฅผ ์ฒจ๋ถํ ์ ์์ต๋๋ค(์: ์์ธ๊ฐ ๋ฐ์ํ์ ๋ ์ฌ์ฉํ ์ ์๋ ์ํฉ๋ณ ์ ๋ณด๋ฅผ ์ถ๊ฐ).
- ํ์ฌ ๋น๊ณต๊ฐ ํด๋์ค๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ํน์ ์ ํ Self๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. Self๋ฅผ ์ฌ์ฉํ๋ฉด TypeVar๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ผ๋ก ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ ๋ฉ์๋์ ์ฃผ์์ ๋ฌ ์ ์์ต๋๋ค. class MyLock: def __enter__(self) -> Self: self.lock() return self
- LiteralString ์ ํ๊ณผ ํธํ๋๋ ๋ฌธ์์ด ๋ฆฌํฐ๋ด๋ง ํฌํจํ ์ ์๋ ํน์ LiteralString ์ ํ์ด ์ถ๊ฐ๋์์ต๋๋ค(์ฆ, LiteralString ์ ํ์ ์์ ๋ฌธ์์ด ๋ฐ ๋ฌธ์์ด, str ์ ํ์ ์์ ๋๋ ๊ฒฐํฉ ๋ฌธ์์ด์ ์ ์ธ). LiteralString ์ ํ์ ์ฌ์ฉํ๋ฉด ๋ฌธ์์ด ์ธ์๋ฅผ ํจ์์ ์ ๋ฌํ๋ ๊ฒ์ ์ ํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด SQL ์ฟผ๋ฆฌ ๋๋ ์ ธ ๋ช ๋ น์ ๋ํ ๋ฌธ์์ด์ ์์ฑํ ๋ ์ทจ์ฝ์ฑ์ ์ด๋ํ ์ ์๋ ๋ฌธ์์ด ์ผ๋ถ๋ฅผ ์์๋ก ๋์ฒดํ๋ ๊ฒ์ ๋๋ค. def run_query(sql: LiteralString) -> ... ... def caller( ์์_string: str, query_string: LiteralString, table_name: LiteralString, ) -> None: run_query("SELECT * FROM Students") # ํ์ธ run_query(literal_string) # ok run_query( "SELECT * FROM " + literal_string) # ok run_query(arbitrary_string) # ์ค๋ฅ run_query( # ์ค๋ฅ f"SELECT * FROM ํ์ WHERE name = {arbitrary_string}" )
- TypeVarTuple ์ ํ์ด ์ถ๊ฐ๋์ด TypeVar์ ๋ฌ๋ฆฌ ํ๋์ ์ ํ์ด ์๋ ์์ ๊ฐ์์ ์ ํ์ ํฌ๊ดํ๋ ๋ณ์ ์ ๋ค๋ฆญ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ TOML ํ์์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๊ธฐ๋ฅ์ด ์๋ tomllib ๋ชจ๋์ด ํฌํจ๋์ด ์์ต๋๋ค.
- ํ์ ๋ฐ ์ ํ ํ๋๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด ํ์ ๋ฐ NotRequired ํ์๋ก ์ ๋ ฅ๋ ์ฌ์ (TypedDict)์ ๊ฐ๋ณ ์์๋ฅผ ํ์ํ๋ ๊ธฐ๋ฅ์ด ์ ๊ณต๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก total ๋งค๊ฐ๋ณ์๊ฐ False๋ก ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ ์ ์ธ๋ ๋ชจ๋ ํ๋๊ฐ ํ์ํฉ๋๋ค. class Movie(TypedDict): title: str year: NotRequired[int] m1: Movie = {"title": "Black Panther", "year": 2018} # OK m2: Movie = {"title": "Star Wars" } # OK (์ฐ๋ ํ๋๋ ์ ํ ์ฌํญ์ ๋๋ค) m3: Movie = {"year": 2022} # ์ค๋ฅ, ํ์ ์ ๋ชฉ ํ๋๊ฐ ์ฑ์์ง์ง ์์์ต๋๋ค.
- TaskGroup ํด๋์ค๋ ์์ ๊ทธ๋ฃน์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋น๋๊ธฐ ์ปจํ ์คํธ ๊ด๋ฆฌ์์ ๊ตฌํ๊ณผ ํจ๊ป asyncio ๋ชจ๋์ ์ถ๊ฐ๋์์ต๋๋ค. ๊ทธ๋ฃน์ ์์ ์ ์ถ๊ฐํ๋ ์์ ์ create_task() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฉ๋๋ค. async def main(): async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(โฆ)) task2 = tg.create_task(another_coro(โฆ)) print("๋ ์์ ๋ชจ๋ ์ด์ ์๋ฃ๋์์ต๋๋ค.")
- ์ถ๊ฐ๋ ํด๋์ค, ๋ฉ์๋ ๋ฐ ํจ์ ๋ฐ์ฝ๋ ์ดํฐ @dataclass_transform์ ์ง์ ํ๋ฉด ์ ์ ์ ํ ๊ฒ์ฌ๊ธฐ๋ @dataclasses.dataclass ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ ๊ฐ์ฒด๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ์๋ ์์์ CustomerModel ํด๋์ค๋ @dataclasses.dataclass ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ์๋ ํด๋์ค์ฒ๋ผ ์ ํ ๊ฒ์ฌ๋ฉ๋๋ค. id ๋ฐ name ๋ณ์๋ฅผ ํ์ฉํ๋ __init__ ๋ฉ์๋๊ฐ ์๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. @dataclass_transform() ํด๋์ค ModelBase: โฆ ํด๋์ค CustomerModel(ModelBase): id: int ์ด๋ฆ: str
- ์ ๊ท์์ ์์ ๊ทธ๋ฃนํ((?>โฆ)) ๋ฐ ์งํฌ(์์ ) ์๋์(*+, ++, ?+, {m,n}+)๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ต๋๋ค.
- ์ ์ฌ์ ์ผ๋ก ์์ ํ์ง ์์ ํ์ผ ๊ฒฝ๋ก๋ฅผ sys.path์ ์๋์ผ๋ก ์ฒจ๋ถํ๋ ๊ฒ์ ๋นํ์ฑํํ๊ธฐ ์ํด "-P" ๋ช ๋ น์ค ์ต์ ๊ณผ PYTHONSAFEPATH ํ๊ฒฝ ๋ณ์๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
- ์ด์ "-V:" ๊ตฌ๋ฌธ์ ์ง์ํ๋ Windows ํ๋ซํผ์ฉ py.exe ์ ํธ๋ฆฌํฐ๊ฐ ํฌ๊ฒ ํฅ์๋์์ต๋๋ค. / " ์ธ์๋ "- . ".
- C API์ ๋ง์ ๋งคํฌ๋ก๊ฐ ์ผ๋ฐ ๋๋ ์ ์ ์ธ๋ผ์ธ ํจ์๋ก ๋ณํ๋์์ต๋๋ค.
- uu, cgi,pipes, crypt, aifc,chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev ๋ฐ sunau ๋ชจ๋์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ผ๋ฉฐ Python์์ ์ ๊ฑฐ๋ ์์ ์ ๋๋ค. 3.13 ๋ฆด๋ฆฌ์ค. PyUnicode_Encode* ํจ์๋ฅผ ์ ๊ฑฐํ์ต๋๋ค.
์ถ์ฒ : opennet.ru