Python 3.11 ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์ถœ์‹œ

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

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