{"id":497571,"date":"2026-10-06T11:13:26","date_gmt":"2026-10-06T11:13:26","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=497571"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2026-10-06T11:13:26","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=497571","title":{"rendered":"\u041d\u0430\u0445\u043e\u0434\u043a\u0438 \u0432 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u0435: \u043c\u0438\u0440 \u043f\u0438\u0442\u043e\u043d\u0430 \u0437\u0430 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c 2026"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/efb\/631\/c3f\/efb631c3f986cc58a74ca097df2ab513.jpg\" alt=\"\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u043c\u0438\u0440 \u043d\u0430\u0445\u043e\u0434\u043e\u043a \u0432 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u0435!\" title=\"\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u043c\u0438\u0440 \u043d\u0430\u0445\u043e\u0434\u043e\u043a \u0432 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u0435!\" width=\"780\" height=\"440\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/efb\/631\/c3f\/efb631c3f986cc58a74ca097df2ab513.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/efb\/631\/c3f\/efb631c3f986cc58a74ca097df2ab513.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u043c\u0438\u0440 \u043d\u0430\u0445\u043e\u0434\u043e\u043a \u0432 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u0435!<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u043e\u0442 \u0438 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u043b\u0430 \u0437\u043e\u043b\u043e\u0442\u0430\u044f \u043e\u0441\u0435\u043d\u044c!<\/p>\n<p>\u0412 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u0435 \u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043d\u044c \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0443 \u201c\u043e\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u043e\u0445\u043d\u0443\u0442 \u043a\u043e\u043d\u0438, \u043d\u0443 \u0430 \u044f \u0431\u0435\u0441\u043c\u0435\u0440\u0442\u043d\u044b\u0439 \u043f\u043e\u043d\u0438\u201d. \u0421\u0434\u0435\u043b\u0430\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0443\u0447\u0430 \u0432\u0441\u0435\u0433\u043e! \u041d\u043e\u0432\u044b\u0435 \u0440\u0435\u043b\u0438\u0437\u044b, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043a\u0440\u0443\u0442\u044b\u0435 \u0444\u0438\u0447\u0438, \u0434\u043e\u043a\u043b\u0430\u0434 \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438. \u0410 \u0435\u0449\u0435 \u043d\u0430\u0448\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u043e \u043a\u0443\u0447\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u0435. <\/p>\n<p>\u0421 \u043c\u0435\u043d\u044f \u043a\u0430\u043a \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u0435\u0437 \u043d\u0435\u0439\u0440\u043e\u0441\u043b\u043e\u043f\u0430 \u0438 \u0418\u0418, \u0441 \u0432\u0430\u0441 \u043a\u0430\u043a \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0438 \u043b\u0430\u0439\u043a\u0438! \u0410 \u0432\u043e\u0442 \u0442\u0443\u0442<a href=\"https:\/\/habr.com\/ru\/articles\/1076694\/\" rel=\"noopener nofollow\"> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442<\/a> \u0437\u0430 \u0430\u0432\u0433\u0443\u0441\u0442.<\/p>\n<p>\u041f\u043e\u0433\u043d\u0430\u043b\u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0432 \u043f\u0438\u0442\u043e\u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e!<\/p>\n<hr\/>\n<h2>CPython<\/h2>\n<p><strong>\u041c\u043e\u0439 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0432\u043a\u043b\u0430\u0434 \u0437\u0430 \u043c\u0435\u0441\u044f\u0446<\/strong><\/p>\n<p>\u042f \u043e\u0447\u0435\u043d\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0441\u044f <code>django-modern-rest<\/code>, \u043d\u043e <a href=\"https:\/\/github.com\/python\/cpython\/pull\/154347\" rel=\"noopener nofollow\">\u0432 CPython \u0443\u0441\u043f\u0435\u043b \u0432\u043b\u0438\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0438\u0442<\/a> (\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0442 Pablo): \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0430\u0445 \u0432 \u0438\u043c\u0435\u043d\u0430\u0445 <code>__future__<\/code> \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u0432, \u0431\u0443\u0434\u0435\u0442 \u043a\u0440\u0430\u0441\u0438\u0432\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430. \u0411\u044b\u043b\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; from __future__ import anotations  File \"&lt;python-input-0&gt;\", line 1    from __future__ import anotations                           ^^^^^^^^^^SyntaxError: future feature anotations is not defined<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<p>\u0421\u0442\u0430\u043b\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">&gt;&gt;&gt; from __future__ import anotations  File \"&lt;python-input-0&gt;\", line 1    from __future__ import anotations                           ^^^^^^^^^^SyntaxError: future feature 'anotations' is not defined. Did you mean: 'annotations'?<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u042f \u0432\u0441\u0435\u0433\u0434\u0430 \u0438 \u0432\u0435\u0437\u0434\u0435 \u0442\u043e\u043f\u043b\u044e \u0437\u0430 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445.<\/p>\n<p><strong>\u041e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f PEP&#8217;\u043e\u0432<\/strong><\/p>\n<p>\u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043a\u0430\u043d\u0430\u043b\u0435 \u0432\u044b\u0448\u043b\u043e \u0434\u0432\u0430 \u043f\u043e\u0441\u0442\u0430 (<a href=\"https:\/\/t.me\/opensource_findings\/987\" rel=\"noopener nofollow\">\u0440\u0430\u0437<\/a>, <a href=\"https:\/\/t.me\/opensource_findings\/988\" rel=\"noopener nofollow\">\u0434\u0432\u0430<\/a>) \u043f\u0440\u043e \u043d\u043e\u0432\u044b\u0435 PEP&#8217;\u044b \u0432 Python. \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u044e\u0441\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043d\u0430 <a href=\"https:\/\/peps.python.org\/pep-0823\" rel=\"noopener nofollow\">PEP-823<\/a> \u0438 <a href=\"https:\/\/peps.python.org\/pep-0824\" rel=\"noopener nofollow\">PEP-824<\/a>. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/t.me\/opensource_findings\" rel=\"noopener nofollow\">\u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u043a\u0430\u043d\u0430\u043b\u0435<\/a>. \u041e\u043d\u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c &#171;\u043c\u043e\u043d\u0430\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 <code>None<\/code> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439&#187;. <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 PEP \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d \u0434\u0432\u0443\u043c \u043d\u043e\u0432\u044b\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u043c <code>?.<\/code> \u0438 ?[], \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b \u0434\u043b\u044f <code>some?.field<\/code> \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043a\u043e\u0434\u043e\u043c:<\/p>\n<pre><code class=\"python\">if some is not None:    field = some.fieldelse:    field = None<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e <code>some?['field']<\/code> \u0434\u0435\u043b\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u0447\u0435\u0440\u0435\u0437 <code>__getitem__<\/code>, \u0432\u043c\u0435\u0441\u0442\u043e <code>__getattr__<\/code> \u0432 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u0432\u044b\u0448\u0435. \u041d\u0430 \u0440\u0435\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0435\u0449\u0435 \u043b\u0443\u0447\u0448\u0435:<\/p>\n<pre><code class=\"python\">def get_customer_name(data: Data) -&gt; str | None:    return data.customer?.user?.name.lower()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u0434 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u0442 \u0432 \u0442\u0430\u043a\u0443\u044e \u0431\u0430\u043d\u0434\u0443\u0440\u0443:<\/p>\n<pre><code class=\"python\">def get_customer_name(data: Data) -&gt; str | None:    \"\"\"Get customer name in lower case if it exists.\"\"\"    customer = data.customer    if customer is not None:        user = customer.user        if user is not None:            return user.name.lower()    return None<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 PEP \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>??<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 <code>is not None<\/code> \u0432 \u0442\u0435\u0440\u043d\u0430\u0440\u043d\u043e\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0435:<\/p>\n<pre><code class=\"python\">def func(param: int | None = None):    print(-1 if param is None else param)# =&gt;def func(param: int | None = None):    print(param ?? -1)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041c\u043d\u043e\u0433\u0438\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u043f\u043e\u0434 \u043f\u043e\u0441\u0442\u043e\u043c \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442: \u0430 \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e <code>param or -1<\/code>? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e <code>or<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430 <code>bool<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c <code>0<\/code> \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0432\u0435\u0434\u0435\u043d, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d. <\/p>\n<p>\u041c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0443\u043d\u043a\u0442 &#8212; \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439; \u0432\u0442\u043e\u0440\u043e\u0439 &#8212; \u043f\u043e\u0434 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c. \u0425\u043e\u0440\u043e\u0448\u043e, \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u0440\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043b\u0438 \u041f\u0415\u041f\u044b \u043d\u0430 \u0434\u0432\u0435 \u0448\u0442\u0443\u043a\u0438. \u041e\u0447\u0435\u043d\u044c \u0436\u0434\u0443 \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e, \u0440\u0430\u0432\u043d\u043e\u0434\u0443\u0448\u0435\u043d \u043f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 \u0432\u0442\u043e\u0440\u043e\u0433\u043e.<\/p>\n<blockquote>\n<p><strong>\u041e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435<\/strong>: \u0427\u0442\u043e \u0432\u044b \u0434\u0443\u043c\u0430\u0435\u0442\u0435 \u043f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 \u0434\u0430\u043d\u043d\u043e\u0433\u043e PEP? \u0425\u043e\u0447\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441?<\/p>\n<\/blockquote>\n<p><strong>\u0420\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430<\/strong><\/p>\n<p><a href=\"https:\/\/discuss.python.org\/t\/vote-to-promote-sergey-miryanov\/109283\" rel=\"noopener nofollow\">\u041d\u043e\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0438<\/a> \u043d\u0430\u0448\u0435\u0433\u043e \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u043e\u0433\u043e \u0421\u0435\u0440\u0433\u0435\u044f \u041c\u0438\u0440\u044f\u043d\u043e\u0432\u0430 (<a href=\"https:\/\/habr.com\/users\/zzzzzzerg\" rel=\"noopener nofollow\">@zzzzzzerg<\/a>) \u043d\u0430 \u043f\u043e\u0441\u0442 CPython Core Developer. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043b\u044e\u0434\u0435\u0439, \u043a\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430\u0434 GC. \u041e\u043f\u0440\u043e\u0441 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f \u0437\u0430\u0432\u0442\u0440\u0430. \u041e\u0447\u0435\u043d\u044c \u043d\u0430\u0434\u0435\u0438\u043c\u0441\u044f \u0438 \u0432\u0435\u0440\u0438\u043c! <\/p>\n<p>\u0410 \u043f\u043e\u043a\u0430 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0435\u0433\u043e \u0434\u043e\u043a\u043b\u0430\u0434 \u0441 \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0435\u0433\u043e PyCon:<\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/6ac4aef94d49dc1f0383e28d\" data-style=\"\" id=\"6ac4aef94d49dc1f0383e28d\" width=\"\" data-habr-games=\"\"><\/div>\n<p>\u0428\u0443\u0442\u043a\u0438 \u043f\u0440\u043e \u0441\u0431\u043e\u0440 \u043c\u0443\u0441\u043e\u0440\u0430 \u043f\u0430\u0439\u0442\u043e\u043d \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0441\u0435\u0445 \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 \u043d\u0430 \u0418\u0418 &#8212; \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445!<\/p>\n<h2>msgspec<\/h2>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e <a href=\"https:\/\/github.com\/msgspec\/msgspec\/releases\/tag\/0.22.0\" rel=\"noopener nofollow\">\u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0440\u0435\u043b\u0438\u0437 0.22.0 \u0432\u0435\u0440\u0441\u0438\u0438<\/a>!<\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0439. \u042f \u0431\u044b \u0445\u043e\u0442\u0435\u043b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043d\u0430 \u043e\u0434\u043d\u043e\u043c (\u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435). \u041f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u0440\u043e \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>dataclass<\/code> \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 <a href=\"https:\/\/github.com\/msgspec\/msgspec\/pull\/1196\" rel=\"noopener nofollow\">\u0437\u0430 \u0441\u0447\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u0438\u043a\u0438 <\/a>\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f <code>__dataclass_field__<\/code> \u0438\u0437 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043a\u043e\u0434 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"cpp\">\/\/ \u0411\u044b\u043b\u043e:PyObject *fields = PyObject_GetAttr(obj, self-&gt;mod-&gt;str___dataclass_fields__);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0410 \u0432\u043e\u0442 \u0442\u0430\u043a \u0441\u0442\u0430\u043b\u043e:<\/p>\n<pre><code class=\"cpp\">static MS_INLINE PyObject *ms_type_lookup_ref(PyTypeObject *type, PyObject *name) {#if PY313_PLUS    return _PyType_LookupRef(type, name);#else    PyObject *out = _PyType_Lookup(type, name);    Py_XINCREF(out);    return out;#endif}static PyObject *ms_get_dataclass_fields(MsgspecState *mod, PyTypeObject *type, PyObject *obj) {    PyObject *fields = ms_type_lookup_ref(type, mod-&gt;str___dataclass_fields__);    if (fields == NULL) return NULL;    if (MS_LIKELY(        PyDict_CheckExact(fields) &amp;&amp;        type-&gt;tp_getattro == PyObject_GenericGetAttr    )) {        return fields;    }    Py_DECREF(fields);    fields = PyObject_GetAttr(obj, mod-&gt;str___dataclass_fields__);    if (fields == NULL) PyErr_Clear();    return fields;}\/\/ \u0421\u0442\u0430\u043b\u043e:PyObject *fields = ms_get_dataclass_fields(self-&gt;mod, type, obj);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0427\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c? \u0420\u0430\u043d\u044c\u0448\u0435 \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 <code>__dataclass_fields__<\/code> \u043f\u0440\u044f\u043c\u043e \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430, \u0447\u0442\u043e \u0447\u0430\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u043e python \u043a\u043e\u0434 \u0432 <code>__getattr__<\/code> \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430. \u0422\u0435\u043f\u0435\u0440\u044c, \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 <code>type(instance).__dataclass_fields__<\/code>, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u0435\u0440\u043d\u0443\u043b\u043e\u0441\u044c (\u0438\u043b\u0438 \u0432\u0435\u0440\u043d\u0443\u043b\u043e\u0441\u044c \u043d\u0435 \u0442\u043e), \u0442\u043e \u043c\u044b \u0438\u0434\u0435\u043c \u043d\u0430 \u0441\u0442\u0430\u0440\u044b\u0439 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u0443\u0442\u044c. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442?<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/077\/716\/a89\/077716a89f1a5a6972e007dceabf93e8.png\" alt=\"\u041a\u0430\u043a\u0438\u0435-\u0442\u043e \u043a\u0435\u0439\u0441\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0438\u0441\u044c \u0430\u0436 \u043d\u0430 73%, \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 5%\" title=\"\u041a\u0430\u043a\u0438\u0435-\u0442\u043e \u043a\u0435\u0439\u0441\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0438\u0441\u044c \u0430\u0436 \u043d\u0430 73%, \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 5%\" width=\"1588\" height=\"1044\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/077\/716\/a89\/077716a89f1a5a6972e007dceabf93e8.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/077\/716\/a89\/077716a89f1a5a6972e007dceabf93e8.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041a\u0430\u043a\u0438\u0435-\u0442\u043e \u043a\u0435\u0439\u0441\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0438\u0441\u044c \u0430\u0436 \u043d\u0430 73%, \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 5%<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0440\u0443\u0442\u043e? \u041a\u0440\u0443\u0442\u043e. \u0421\u0442\u0430\u0440\u0430\u0439\u0442\u0435\u0441\u044c \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a \u0432 \u0432\u0430\u0448\u0435\u043c C-API \u043a\u043e\u0434\u0435, \u0438\u0437\u0431\u0435\u0433\u0430\u0439\u0442\u0435 <code>PyObject_GetAttr<\/code> \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e.<\/p>\n<p>\u0420\u0435\u043b\u0438\u0437 \u0432\u044b\u0448\u0435\u043b \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u043c, \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e! \u0415\u0441\u043b\u0438 \u0435\u0449\u0435 \u043d\u0435 \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 <code>msgspec<\/code> &#8212; \u0441\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f!<\/p>\n<blockquote>\n<p><strong>\u041e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435<\/strong>: \u0414\u043e\u0432\u043e\u043b\u044c\u043d\u044b \u043b\u0438 \u0432\u044b \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c pydantic? \u0417\u0430\u043c\u0435\u0447\u0430\u0435\u0442\u0435 \u043b\u0438 \u0432\u044b \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445?<\/p>\n<\/blockquote>\n<h2>django-modern-rest<\/h2>\n<p>\u0421\u0430\u043c\u044b\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0431\u043b\u043e\u043a \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u0431\u044b\u043b \u0442\u0443\u0442! \u0417\u0430 \u043c\u0435\u0441\u044f\u0446 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0432\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0440\u0435\u043b\u0438\u0437\u0430 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 <code>#opensource_september<\/code>, \u0431\u044b\u043b\u043e <a href=\"https:\/\/t.me\/opensource_findings\/985\" rel=\"noopener nofollow\">\u0442\u0430\u043a\u043e\u0435 \u0441\u043e\u043e\u0431\u044b\u0442\u0438\u0435 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435<\/a>, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043d\u0435\u0433\u043e:<\/p>\n<ul>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u043e <a href=\"https:\/\/github.com\/wemake-services\/django-modern-rest\/issues?q=is%3Aissue+state%3Aopen+label%3A%22opensource+september%22\" rel=\"noopener nofollow\">92 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430 GithHub<\/a><\/p>\n<\/li>\n<li>\n<p>\u0418\u0437 \u043d\u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u043e 85<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u0430 \u0446\u0438\u0444\u0440\u0430 \u0432 150 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0440\u0438\u0431\u044c\u044e\u0442\u043e\u0440\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0447\u0442\u0438 50 \u043d\u043e\u0432\u044b\u0445 \u043a\u043e\u043d\u0442\u0440\u0438\u0431\u044c\u044e\u0442\u043e\u0440\u043e\u0432 \u0437\u0430 \u043c\u0435\u0441\u044f\u0446<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0441\u043e\u0431\u0443\u044e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c <a href=\"https:\/\/t.me\/set_link_later\" rel=\"noopener nofollow\">\u041e\u043b\u044c\u0433\u0435 \u041f\u0438\u0447\u0443\u0436\u043a\u0438\u043d\u043e\u0439<\/a> \u0437\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0432\u043a\u043b\u0430\u0434 \u0432 \u043e\u0431\u0430 \u0440\u0435\u043b\u0438\u0437\u0430.<\/p>\n<p><strong>\u0420\u0435\u043b\u0438\u0437 0.15.0<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/wemake-services\/django-modern-rest\/releases#release-0.15.0\" rel=\"noopener nofollow\">\u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439<\/a>.<\/p>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435: \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043b\u0435\u043d\u0438\u0432\u044b\u0435 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u0440\u0430\u0445, \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0443\u0436\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u0440\u0435, \u0447\u0442\u043e \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u043d\u044f\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u043c\u0435\u0442\u0430-\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043d\u0430\u043b\u0435\u0442\u0443: <\/p>\n<pre><code class=\"python\">class LoginController(Controller[_SerializerT]):    status_code: ClassVar[HTTPStatus] = HTTPStatus.OK    @classmethod    def lazy_spec(cls) -&gt; ModifyAnyCallable:        return modify(status_code=cls.status_code)    @modify.lazy(lazy_spec)    def get(self) -&gt; str:        return 'login'class CreatedLogin(LoginController[PydanticSerializer]):    status_code = HTTPStatus.CREATED<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c <code>CreatedLogin<\/code> \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0430\u0442\u0443\u0441 \u043a\u043e\u0434 \u0434\u043b\u044f \u043e\u0442\u0432\u0435\u0442\u043e\u0432. \u0423\u0434\u043e\u0431\u043d\u043e!<\/p>\n<p><strong>\u0420\u0435\u043b\u0438\u0437 0.16.0<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/wemake-services\/django-modern-rest\/releases#release-0.16.0\" rel=\"noopener nofollow\">\u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439<\/a>.<\/p>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435: \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0441\u0442\u0430\u043b \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445. \u0412\u043e\u0442 \u0441\u0432\u043e\u0431\u0434\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0df\/762\/4eb\/0df7624eb24b0ba33be5dd5477bb4f82.png\" alt=\"\u041c\u044b \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0443\u0441\u043a\u043e\u0440\u044f\u0442\u044c django-modern-rest!\" title=\"\u041c\u044b \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0443\u0441\u043a\u043e\u0440\u044f\u0442\u044c django-modern-rest!\" width=\"1784\" height=\"728\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/0df\/762\/4eb\/0df7624eb24b0ba33be5dd5477bb4f82.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0df\/762\/4eb\/0df7624eb24b0ba33be5dd5477bb4f82.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041c\u044b \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0443\u0441\u043a\u043e\u0440\u044f\u0442\u044c django-modern-rest!<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e \u043d\u0430\u0448\u0438\u043c \u0431\u0435\u043d\u0447\u0430\u043c \u043c\u044b \u0443\u0436\u0435 <a href=\"https:\/\/github.com\/wemake-services\/django-modern-rest\/tree\/master\/benchmarks#results\" rel=\"noopener nofollow\">\u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 FastAPI<\/a> (\u0433\u0434\u0435-\u0442\u043e \u0447\u0443\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0433\u0434\u0435-\u0442\u043e \u0447\u0443\u0442\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u0435\u0435). \u0414\u0430\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u0435\u0449\u0435 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0435\u0449\u0435 \u043b\u0443\u0447\u0448\u0435, \u0435\u0449\u0435 \u0443\u0434\u043e\u0431\u043d\u0435\u0435. \u0418 FastAPI \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0430\u043f\u044b\u0432\u0430\u0442\u044c!<\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e:<\/p>\n<ul>\n<li>\n<p>\u041f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043d\u0430\u0434 DX<\/p>\n<\/li>\n<li>\n<p>\u0423\u043b\u0443\u0447\u0448\u0438\u043b\u0438 AI \u0442\u0443\u043b\u0438\u043d\u0433 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439<\/p>\n<\/li>\n<li>\n<p>\u041a\u0440\u0430\u0442\u043d\u043e \u043f\u0440\u043e\u043a\u0430\u0447\u0430\u043b\u0438 OpenAPI \u0441\u0445\u0435\u043c\u0443 \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c \u0434\u0430\u0436\u0435 <code>x-<\/code> \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0432 \u0442\u0438\u043f\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u043c API!<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u043b\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043d\u044b\u0439 \u0430\u0443\u0434\u0438\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438<\/p>\n<\/li>\n<li>\n<p>\u0423\u043b\u0443\u0447\u0448\u0438\u043b\u0438 API \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u043b\u043b\u0435\u0433\u0438 \u0438\u0437 core-\u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>django-modern-rest<\/code> \u0434\u043e\u043b\u043e\u0436\u0438\u043b\u0438\u0441\u044c \u043d\u0430 PyCon \u043e \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435:<\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/6ac4af404d49dc1f0383e2af\" data-style=\"\" id=\"6ac4af404d49dc1f0383e2af\" width=\"\" data-habr-games=\"\"><\/div>\n<blockquote>\n<p><strong>\u041e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435<\/strong>: \u041a\u0430\u043a\u0438\u0435 \u0444\u0438\u0447\u0438 \u0432\u044b \u0431\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u043d\u043e\u0432\u044b\u0445 \u0440\u0435\u043b\u0438\u0437\u0430\u0445 <code>django-modern-rest<\/code>?<\/p>\n<\/blockquote>\n<h2>pustota<\/h2>\n<p>\u0420\u0435\u043b\u0438\u0437\u043d\u0443\u043b\u0438 \u0442\u0435\u043c\u0443 pustota <a href=\"https:\/\/github.com\/pustota-theme\/pustota.codex\" rel=\"noopener nofollow\">\u0434\u043b\u044f codex<\/a>, \u0432\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 <a href=\"https:\/\/github.com\/pustota-theme\/pustota\" rel=\"noopener nofollow\">\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b<\/a>:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/543\/801\/54b\/54380154b37013fa012219f39ed75769.png\" alt=\"pustota \u0434\u043b\u044f vscode: https:\/\/github.com\/pustota-theme\/pustota\" title=\"pustota \u0434\u043b\u044f vscode: https:\/\/github.com\/pustota-theme\/pustota\" width=\"2928\" height=\"1910\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/543\/801\/54b\/54380154b37013fa012219f39ed75769.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/543\/801\/54b\/54380154b37013fa012219f39ed75769.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>pustota \u0434\u043b\u044f vscode: <a href=\"https:\/\/github.com\/pustota-theme\/pustota\" rel=\"noopener nofollow\">https:\/\/github.com\/pustota-theme\/pustota<\/a><\/figcaption><\/div>\n<\/figure>\n<p>\u0410 \u0432\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 <code>pustota.codex<\/code>:<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3e2\/e2b\/fc2\/3e2e2bfc27d9b53db8e76b1f12359162.png\" alt=\"https:\/\/github.com\/pustota-theme\/pustota.codex\" title=\"https:\/\/github.com\/pustota-theme\/pustota.codex\" width=\"2928\" height=\"1918\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/3e2\/e2b\/fc2\/3e2e2bfc27d9b53db8e76b1f12359162.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3e2\/e2b\/fc2\/3e2e2bfc27d9b53db8e76b1f12359162.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption><a href=\"https:\/\/github.com\/pustota-theme\/pustota.codex\" rel=\"noopener nofollow\">https:\/\/github.com\/pustota-theme\/pustota.codex<\/a><\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e <a href=\"https:\/\/github.com\/kondratevdev\" rel=\"noopener nofollow\">\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0443<\/a> \u0437\u0430 \u0442\u0435\u043c\u0443! <\/p>\n<blockquote>\n<p><strong>\u041e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435<\/strong>: \u041d\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u043b\u0438 \u0432\u0430\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u044b\u0435 \u0442\u0435\u043c\u044b? \u041a\u0430\u043a\u0438\u0435 \u0432\u0430\u0448\u0438 \u043b\u044e\u0431\u0438\u043c\u044b\u0435?<\/p>\n<\/blockquote>\n<h2>\u041f\u0440\u043e\u0435\u043a\u0442\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430<\/h2>\n<ul>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 DTO (pydantic \/ adaptix \/ dataclasses) \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 JSON \u043f\u043e\u043b\u044f \u0432 Django \u043c\u043e\u0434\u0435\u043b\u044f\u0445: <a href=\"https:\/\/github.com\/skv0zsneg\/django-dto-field\" rel=\"noopener nofollow\">https:\/\/github.com\/skv0zsneg\/django-dto-field<\/a> <\/p>\n<\/li>\n<li>\n<p>Yara ORM \u2014 async ORM \u0434\u043b\u044f Python \u0441 \u0434\u0432\u0438\u0436\u043a\u043e\u043c \u043d\u0430 Rust. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0439 Django\/Tortoise API, \u043d\u043e \u0447\u0442\u043e\u0431\u044b \u0433\u043e\u0440\u044f\u0447\u0438\u0439 \u043f\u0443\u0442\u044c (\u043f\u0443\u043b, \u0431\u0438\u043d\u0434\u0438\u043d\u0433, \u0434\u0435\u043a\u043e\u0434\u0438\u043d\u0433 \u0441\u0442\u0440\u043e\u043a) \u043a\u0440\u0443\u0442\u0438\u043b\u0441\u044f \u0432 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u043d\u0430 Rust: <a href=\"https:\/\/github.com\/vsdudakov\/yara-orm\" rel=\"noopener nofollow\">https:\/\/github.com\/vsdudakov\/yara-orm<\/a><\/p>\n<\/li>\n<li>\n<p>FastAdmin &#8212; \u0430\u0434\u043c\u0438\u043d\u043a\u0430 \u0432 \u0434\u0443\u0445\u0435 Django Admin, \u043d\u043e \u0434\u043b\u044f FastAPI, Flask \u0438 Django, \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 orm &#8212;\u00a0 Tortoise, Django ORM, SQLAlchemy, Pony \u0438\u043b\u0438 Yara ORM: <a href=\"https:\/\/github.com\/vsdudakov\/fastadmin\" rel=\"noopener nofollow\">https:\/\/github.com\/vsdudakov\/fastadmin<\/a><\/p>\n<\/li>\n<li>\n<p>Yara Code \u2014 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043f\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043a\u043e\u0434\u0438\u043d\u0433-\u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438 (Claude Code, Codex, Cursor CLI): <a href=\"https:\/\/github.com\/vsdudakov\/yara-code\" rel=\"noopener nofollow\">https:\/\/github.com\/vsdudakov\/yara-code<\/a> <\/p>\n<\/li>\n<li>\n<p>\u0421\u043a\u0438\u043b\u043b \u0434\u043b\u044f Claude Code \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u0438\u0441\u0430\u0442\u044c \u043b\u0443\u0447\u0448\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430 Go. \u0412\u043d\u0443\u0442\u0440\u0438 \u2014 \u0432\u044b\u0436\u0438\u043c\u043a\u0430 \u0438\u0437 13 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432: \u0433\u0430\u0439\u0434\u044b Google \u0438 Uber, \u0447\u0435\u0442\u044b\u0440\u0435 Go-\u0441\u043a\u0438\u043b\u043b\u0430 \u0438 \u0447\u0435\u0442\u044b\u0440\u0435 \u0434\u043e\u043d\u043e\u0440\u0430 \u043f\u043e \u0430\u0433\u0435\u043d\u0442\u0430\u043c \u0438 MCP. \u0412\u0441\u0451 \u0441\u0432\u0435\u0434\u0435\u043d\u043e \u0432 \u043e\u0434\u0438\u043d \u043d\u0435\u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0432\u044b\u0439 \u0441\u0432\u043e\u0434 \u0441 \u044f\u0432\u043d\u043e\u0439 \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435\u0439 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u0432, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0430\u0445 \u043f\u043e\u0431\u0435\u0436\u0434\u0430\u0435\u0442 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430, \u0430 \u043d\u0435 \u043b\u0438\u043d\u0442\u0435\u0440: <a href=\"https:\/\/github.com\/Djarvur\/go-ultimate\" rel=\"noopener nofollow\">https:\/\/github.com\/Djarvur\/go-ultimate<\/a> <\/p>\n<\/li>\n<li>\n<p>Rust \u0431\u0435\u043a\u0435\u043d\u0434 \u0434\u043b\u044f Asr \u0434\u043b\u044f GigaAm v3: <a href=\"https:\/\/github.com\/deeray-ltd\/gigaam-v3-runtime\" rel=\"noopener nofollow\">https:\/\/github.com\/deeray-ltd\/gigaam-v3-runtime<\/a> <\/p>\n<\/li>\n<li>\n<p>\u041a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 MQTT (\u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 IoT): <a href=\"https:\/\/github.com\/faststream-community\/zMQTT\" rel=\"noopener nofollow\">https:\/\/github.com\/faststream-community\/zMQTT<\/a> <\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043d\u0443\u0436\u0434 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u043f\u0430\u0442\u0447\u0438, \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0432\u044b\u043a\u0430\u0442\u0438\u043b \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u0443\u044e \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0430\u0442\u0447\u0435\u0439 (\u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c). \u041c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b: <a href=\"https:\/\/github.com\/tochka-public\/bitcut\" rel=\"noopener nofollow\">https:\/\/github.com\/tochka-public\/bitcut<\/a> <\/p>\n<\/li>\n<li>\n<p>DB STAT \u2014 \u044d\u0442\u043e \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 PostgreSQL, Greenplum \u0438 Greengage. \u0412 \u043e\u0434\u043d\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445, \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0442\u0430\u0431\u043b\u0438\u0446, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438, \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u0441\u0435\u0441\u0441\u0438\u0438 \u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438: <a href=\"https:\/\/github.com\/OlegEgoism\/DB_STAT\" rel=\"noopener nofollow\">https:\/\/github.com\/OlegEgoism\/DB_STAT<\/a> <\/p>\n<\/li>\n<li>\n<p>C\u043e\u0442\u043d\u0438 \u043d\u0430\u0432\u044b\u043a\u043e\u0432 \u0443 \u0430\u0433\u0435\u043d\u0442\u0430 \u0431\u0435\u0437 \u0440\u0430\u0437\u0434\u0443\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u043c\u043f\u0442\u0430, \u0432 4,4 \u0440\u0430\u0437\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0442\u043e\u043a\u0435\u043d\u043e\u0432: 113k \u2192 25,8k \u0437\u0430 \u0445\u043e\u0434 \u043d\u0430 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u0438\u0437 236 \u043d\u0430\u0432\u044b\u043a\u043e\u0432: <a href=\"https:\/\/github.com\/deyna256\/langchain-skill-router\" rel=\"noopener nofollow\">https:\/\/github.com\/deyna256\/langchain-skill-router<\/a><\/p>\n<\/li>\n<li>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0430 Python, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0438 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0415\u0435 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 @appoint_limit_async \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u043e\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0433\u043e\u043d\u043a\u0438 \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0447\u0442\u043e \u043a\u0440\u0430\u0439\u043d\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043b\u0438\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 API: <a href=\"https:\/\/gitlab.com\/asurnovsurnov\/asynctoolspy\" rel=\"noopener nofollow\">https:\/\/gitlab.com\/asurnovsurnov\/asynctoolspy<\/a> <\/p>\n<\/li>\n<li>\n<p>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 k8s cluster \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439: <a href=\"https:\/\/github.com\/prostoLavr\/libvirtd-tf-infra\" rel=\"noopener nofollow\">https:\/\/github.com\/prostoLavr\/libvirtd-tf-infra<\/a><\/p>\n<\/li>\n<li>\n<p>Markdown Preview Editor \u2014 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 Markdown \u0441 \u0436\u0438\u0432\u044b\u043c \u043f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u043c, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435: \u0444\u0430\u0439\u043b\u044b \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f, \u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u043d\u0435\u0442. \u0423\u043c\u0435\u0435\u0442 GFM, \u0444\u043e\u0440\u043c\u0443\u043b\u044b, Mermaid, \u0432\u043a\u043b\u0430\u0434\u043a\u0438, \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043f\u043e\u043a \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u043c\u0438, \u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 HTML \u0438 PDF: <a href=\"https:\/\/github.com\/ovasendin\/markdown_preview_editor\" rel=\"noopener nofollow\">https:\/\/github.com\/ovasendin\/markdown_preview_editor<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u0425\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442? \u041f\u0438\u0448\u0438\u0442\u0435 \u043e \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 <a href=\"https:\/\/t.me\/opensource_findings_chat\/\" rel=\"noopener nofollow\">\u0432 \u043d\u0430\u0448\u0435\u043c \u0447\u0430\u0442\u0435<\/a>, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u0442\u0435\u0433 <code>#opensource<\/code>, \u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u043c \u043f\u043e\u0434\u0435\u043b\u044e\u0441\u044c!<\/p>\n<h2>\u041e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439<\/h2>\n<ul>\n<li>\n<p>\u0412\u044b\u0448\u0435\u043b \u043d\u043e\u0432\u044b\u0439 \u0440\u0435\u043b\u0438\u0437 <code>mypy<\/code> \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 <code>sentinel<\/code> \u0438 <code>TypeForm<\/code>, \u0447\u0438\u0442\u0430\u0435\u043c <a href=\"https:\/\/github.com\/python\/mypy\/blob\/master\/CHANGELOG.md#mypy-24\" rel=\"noopener nofollow\">\u043f\u043e\u043b\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0434\u043b\u044f 2.4.0 \u0442\u0443\u0442<\/a><\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0448\u0435\u043b \u043d\u043e\u0432\u044b\u0439 \u0440\u0435\u043b\u0438\u0437 <code>wemake-python-styleguide<\/code> \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 <a href=\"https:\/\/github.com\/wemake-services\/wemake-python-styleguide\/releases\/tag\/1.8.1\" rel=\"noopener nofollow\">\u0444\u0438\u043a\u0441\u0430\u043c\u0438 \u0431\u0430\u0433\u043e\u0432 @ 1.8.1<\/a><\/p>\n<\/li>\n<li>\n<p>\u0423 <code>django-stubs<\/code> \u0432\u044b\u0448\u043b\u043e \u0434\u0432\u0430 \u0440\u0435\u043b\u0438\u0437\u0430: <a href=\"https:\/\/github.com\/typeddjango\/django-stubs\/releases\/tag\/6.1.1\" rel=\"noopener nofollow\">6.1.1<\/a> \u0438 <a href=\"https:\/\/github.com\/typeddjango\/django-stubs\/releases\/tag\/6.1.2\" rel=\"noopener nofollow\">6.1.2<\/a>, \u0432 <code>6.1.1<\/code> \u043c\u044b \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044e <code>ReleatedManager<\/code>, \u0430 \u0432 <code>6.1.2<\/code> \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 <code>mypy@2.4.0<\/code><\/p>\n<\/li>\n<li>\n<p>\u0423 <code>django-test-migrations<\/code> <a href=\"https:\/\/github.com\/wemake-services\/django-test-migrations\/releases\/tag\/1.7.0\" rel=\"noopener nofollow\">\u0432\u044b\u0448\u0435\u043b \u043d\u043e\u0432\u044b\u0439 \u0440\u0435\u043b\u0438\u0437 1.7.0<\/a> \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u043d\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 Django<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u0448\u0435\u043b \u043d\u043e\u0432\u044b\u0439 \u0440\u0435\u043b\u0438\u0437 \u043d\u0430\u0448\u0435\u0439 Dependency Injection \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <code>punq<\/code>, <a href=\"https:\/\/github.com\/bobthemighty\/punq\/releases\/tag\/v0.9.0\" rel=\"noopener nofollow\">\u0432 \u0432\u0435\u0440\u0441\u0438\u0438 <code>0.9.0<\/code><\/a> \u043c\u044b \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u043b\u0438 \u0442\u043e, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u044b \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/wemake-services\/dump-env\/releases\/tag\/1.8.0\" rel=\"noopener nofollow\">\u0412\u044b\u0448\u0435\u043b \u043d\u043e\u0432\u044b\u0439 1.8.0 \u0440\u0435\u043b\u0438\u0437<\/a> \u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <code>dump-env<\/code>, \u043e\u043d\u0430 \u043d\u0443\u0436\u043d\u0430 \u0434\u043b\u044f \u0441\u043b\u0438\u044f\u043d\u0438\u044f <code>.env.template<\/code> \u0444\u0430\u0439\u043b\u0430 \u0438 ENV \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 \u043e\u0434\u0438\u043d \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 <code>.env<\/code> \u0444\u0430\u0439\u043b, \u0432 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043c\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043b\u0438 \u043f\u043e\u043b\u043d\u0443\u044e \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0441 \u0444\u043b\u0430\u0433\u043e\u043c <code>--interpolate<\/code><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/t.me\/magnittech\/865\" rel=\"noopener nofollow\">\u0421\u044a\u0435\u0437\u0434\u0438\u043b \u0432 \u0421\u0443\u0437\u0434\u0430\u043b\u044c<\/a> \u0432 \u043f\u0440\u0435\u0441\u0441-\u0442\u0443\u0440 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0431\u043b\u043e\u0433\u0433\u0435\u0440\u0430\u043c\u0438 \u0438 \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c\u0438 \u0438\u0437 <a class=\"mention\" href=\"\/company\/magnit\">Magnit Tech<\/a>. \u0411\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u0442\u043e. \u041f\u0440\u0438\u044f\u0442\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0438\u0442\u0435\u0439\u043b. \u041e\u0431\u0441\u0443\u0434\u0438\u043b \u0441 \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c\u0438 \u0443\u043c\u043d\u044b\u0435 \u043a\u0430\u0441\u0441\u044b, \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0418\u0418, \u043d\u043e\u0432\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043e\u043f\u043b\u0430\u0442\u044b, \u043f\u0440\u0435\u0434\u0438\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0443 \u0441\u043f\u0440\u043e\u0441\u0430, \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u0432 \u043b\u043e\u0433\u0438\u0441\u0442\u0438\u043a\u0435, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u0438\u043c \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c <a href=\"https:\/\/github.com\/wemake-services\/wemake-python-styleguide\" rel=\"noopener nofollow\">wps<\/a><\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c\u0441\u044f <a href=\"https:\/\/itgorky.ru\/bolshaya-vstrecha\" rel=\"noopener nofollow\">\u043a \u043d\u0430\u0448\u0435\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0441\u0442\u0440\u0435\u0447\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430<\/a>: 17 \u043e\u043a\u0442\u044f\u0431\u0440\u044f, \u041d\u0438\u0436\u043d\u0438\u0439 \u041d\u043e\u0432\u0433\u043e\u0440\u043e\u0434. \u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0435 \u043c\u0435\u0440\u043e\u043f\u0440\u0438\u0442\u0438\u0435 \u043e\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u0434\u043b\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430. \u0411\u0443\u0434\u0443\u0442 \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u0442\u044b\u0435 \u0434\u043e\u043a\u043b\u0430\u0434\u044b \u043e\u0442 \u0432\u0430\u0448\u0438\u0445 \u043b\u044e\u0431\u0438\u043c\u044b\u0445 \u044e\u0442\u044e\u0431\u0435\u0440\u043e\u0432 \u0438 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u0435\u0440\u043e\u0432. \u041d\u0443 \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0442\u0443\u0441\u043e\u0432\u043a\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 \u0432 \u0431\u0430\u0440\u0435 \u0438 \u0434\u043e \u0443\u0442\u0440\u0430. \u0416\u0434\u0435\u043c \u0432\u0441\u0435\u0445 \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0445!<\/p>\n<\/li>\n<\/ul>\n<h2>\u0412\u044b\u0432\u043e\u0434\u044b<\/h2>\n<p>\u0410 \u0435\u0441\u043b\u0438 \u0432\u044b \u0434\u0443\u043c\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u044f \u0434\u0435\u043b\u0430\u044e \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 \u0434\u043b\u044f \u043c\u0438\u0440\u0430, \u0442\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c:<\/p>\n<ul>\n<li>\n<p>\u0411\u0443\u0441\u0442\u0438 \u0434\u043b\u044f \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0445 \u043a\u0430\u0440\u0442: <a href=\"https:\/\/boosty.to\/sobolevn\" rel=\"noopener nofollow\">https:\/\/boosty.to\/sobolevn<\/a> <\/p>\n<\/li>\n<li>\n<p>GitHub Sponsors \u0434\u043b\u044f \u0437\u0430\u043f\u0430\u0434\u043d\u044b\u0445 \u043a\u0430\u0440\u0442: <a href=\"https:\/\/github.com\/sponsors\/wemake-services\" rel=\"noopener nofollow\">https:\/\/github.com\/sponsors\/wemake-services<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u042f \u0442\u0430\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0434\u0430\u044e, \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0435\u043b\u0430\u044e \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443, \u0435\u0441\u043b\u0438 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u044f \u0434\u0435\u043b\u0430\u044e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 &#8212; \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u044f \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0443 \u0435\u0435 \u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<p>\u041f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0439\u0442\u0435\u0441\u044c \u043d\u0430 <a href=\"https:\/\/telegram.me\/opensource_findings\" rel=\"noopener nofollow\">\u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b<\/a> \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430, \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0435 \u0447\u0438\u0442\u0430\u0442\u044c. \u0418 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0434\u0430\u0436\u0435 \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f <a href=\"https:\/\/telegram.me\/opensource_findings_python\" rel=\"noopener nofollow\">\u043f\u043e\u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c<\/a>! \u0411\u0443\u0434\u0443 \u0440\u0430\u0434 \u0432\u0438\u0434\u0435\u0442\u044c \u0432\u0430\u0441 \u0447\u0430\u0441\u0442\u044c\u044e \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0430 \ud83d\ude42<\/p>\n<p>\u0414\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0438 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442\u0435 \u0438 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435!<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1091038\/\">https:\/\/habr.com\/ru\/articles\/1091038\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u043c\u0438\u0440 \u043d\u0430\u0445\u043e\u0434\u043e\u043a \u0432 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u0435!\u0412\u043e\u0442 \u0438 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u043b\u0430 \u0437\u043e\u043b\u043e\u0442\u0430\u044f \u043e\u0441\u0435\u043d\u044c!\u0412 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u0435 \u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043d\u044c \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0443 \u201c\u043e\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u043e\u0445\u043d\u0443\u0442 \u043a\u043e\u043d\u0438, \u043d\u0443 \u0430 \u044f \u0431\u0435\u0441\u043c\u0435\u0440\u0442\u043d\u044b\u0439 \u043f\u043e\u043d\u0438\u201d. \u0421\u0434\u0435\u043b\u0430\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0443\u0447\u0430 \u0432\u0441\u0435\u0433\u043e! \u041d\u043e\u0432\u044b\u0435 \u0440\u0435\u043b\u0438\u0437\u044b, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043a\u0440\u0443\u0442\u044b\u0435 \u0444\u0438\u0447\u0438, \u0434\u043e\u043a\u043b\u0430\u0434 \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438. \u0410 \u0435\u0449\u0435 \u043d\u0430\u0448\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u043e \u043a\u0443\u0447\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u0435. \u0421 \u043c\u0435\u043d\u044f \u043a\u0430\u043a \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u0435\u0437 \u043d\u0435\u0439\u0440\u043e\u0441\u043b\u043e\u043f\u0430 \u0438 \u0418\u0418, \u0441 \u0432\u0430\u0441 \u043a\u0430\u043a \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0438 \u043b\u0430\u0439\u043a\u0438! \u0410 \u0432\u043e\u0442 \u0442\u0443\u0442 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u043e\u0448\u043b\u044b\u0439 \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442 \u0437\u0430 \u0430\u0432\u0433\u0443\u0441\u0442.\u041f\u043e\u0433\u043d\u0430\u043b\u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0432 \u043f\u0438\u0442\u043e\u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e!CPython\u041c\u043e\u0439 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0432\u043a\u043b\u0430\u0434 \u0437\u0430 \u043c\u0435\u0441\u044f\u0446\u042f \u043e\u0447\u0435\u043d\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0441\u044f django-modern-rest, \u043d\u043e \u0432 CPython \u0443\u0441\u043f\u0435\u043b \u0432\u043b\u0438\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0438\u0442 (\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0442 Pablo): \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0430\u0445 \u0432 \u0438\u043c\u0435\u043d\u0430\u0445 __future__ \u0438\u043c\u043f\u043e\u0440\u0442\u043e\u0432, \u0431\u0443\u0434\u0435\u0442 \u043a\u0440\u0430\u0441\u0438\u0432\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430. \u0411\u044b\u043b\u043e \u0442\u0430\u043a:&gt;&gt;&gt; from __future__ import anotations  File &#171;&lt;python-input-0&gt;&#187;, line 1    from __future__ import anotations                           ^^^^^^^^^^SyntaxError: future feature anotations is not defined\u0421\u0442\u0430\u043b\u043e \u0442\u0430\u043a:&gt;&gt;&gt; from __future__ import anotations  File &#171;&lt;python-input-0&gt;&#187;, line 1    from __future__ import anotations                           ^^^^^^^^^^SyntaxError: future feature &#8216;anotations&#8217; is not defined. Did you mean: &#8216;annotations&#8217;?\u042f \u0432\u0441\u0435\u0433\u0434\u0430 \u0438 \u0432\u0435\u0437\u0434\u0435 \u0442\u043e\u043f\u043b\u044e \u0437\u0430 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445.\u041e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f PEP&#8217;\u043e\u0432\u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043a\u0430\u043d\u0430\u043b\u0435 \u0432\u044b\u0448\u043b\u043e \u0434\u0432\u0430 \u043f\u043e\u0441\u0442\u0430 (\u0440\u0430\u0437, \u0434\u0432\u0430) \u043f\u0440\u043e \u043d\u043e\u0432\u044b\u0435 PEP&#8217;\u044b \u0432 Python. \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u044e\u0441\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043d\u0430 PEP-823 \u0438 PEP-824. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u043a\u0430\u043d\u0430\u043b\u0435. \u041e\u043d\u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c &#171;\u043c\u043e\u043d\u0430\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 None \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439&#187;. \u041f\u0435\u0440\u0432\u044b\u0439 PEP \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d \u0434\u0432\u0443\u043c \u043d\u043e\u0432\u044b\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u043c ?. \u0438 ?[], \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b \u0434\u043b\u044f some?.field \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043a\u043e\u0434\u043e\u043c:if some is not None:    field = some.fieldelse:    field = None\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e some?[&#8216;field&#8217;] \u0434\u0435\u043b\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u0447\u0435\u0440\u0435\u0437 __getitem__, \u0432\u043c\u0435\u0441\u0442\u043e __getattr__ \u0432 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u0432\u044b\u0448\u0435. \u041d\u0430 \u0440\u0435\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0435\u0449\u0435 \u043b\u0443\u0447\u0448\u0435:def get_customer_name(data: Data) -&gt; str | None:    return data.customer?.user?.name.lower()\u0412\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u0434 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u0442 \u0432 \u0442\u0430\u043a\u0443\u044e \u0431\u0430\u043d\u0434\u0443\u0440\u0443:def get_customer_name(data: Data) -&gt; str | None:    &#171;&#187;&#187;Get customer name in lower case if it exists.&#187;&#187;&#187;    customer = data.customer    if customer is not None:        user = customer.user        if user is not None:            return user.name.lower()    return None\u0412\u0442\u043e\u0440\u043e\u0439 PEP \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 ??, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 is not None \u0432 \u0442\u0435\u0440\u043d\u0430\u0440\u043d\u043e\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0435:def func(param: int | None = None):    print(-1 if param is None else param)# =&gt;def func(param: int | None = None):    print(param ?? -1)\u041c\u043d\u043e\u0433\u0438\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u043f\u043e\u0434 \u043f\u043e\u0441\u0442\u043e\u043c \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442: \u0430 \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e param or -1? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e or \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430 bool, \u0442\u043e \u0435\u0441\u0442\u044c 0 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0432\u0435\u0434\u0435\u043d, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d. \u041c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0443\u043d\u043a\u0442 &#8212; \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439; \u0432\u0442\u043e\u0440\u043e\u0439 &#8212; \u043f\u043e\u0434 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c. \u0425\u043e\u0440\u043e\u0448\u043e, \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u0440\u044b \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043b\u0438 \u041f\u0415\u041f\u044b \u043d\u0430 \u0434\u0432\u0435 \u0448\u0442\u0443\u043a\u0438. \u041e\u0447\u0435\u043d\u044c \u0436\u0434\u0443 \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e, \u0440\u0430\u0432\u043d\u043e\u0434\u0443\u0448\u0435\u043d \u043f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 \u0432\u0442\u043e\u0440\u043e\u0433\u043e.\u041e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435: \u0427\u0442\u043e \u0432\u044b \u0434\u0443\u043c\u0430\u0435\u0442\u0435 \u043f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 \u0434\u0430\u043d\u043d\u043e\u0433\u043e PEP? \u0425\u043e\u0447\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441?\u0420\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430\u041d\u043e\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u043e\u0433\u043e \u0421\u0435\u0440\u0433\u0435\u044f \u041c\u0438\u0440\u044f\u043d\u043e\u0432\u0430 (@zzzzzzerg) \u043d\u0430 \u043f\u043e\u0441\u0442 CPython Core Developer. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043b\u044e\u0434\u0435\u0439, \u043a\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430\u0434 GC. \u041e\u043f\u0440\u043e\u0441 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f \u0437\u0430\u0432\u0442\u0440\u0430. \u041e\u0447\u0435\u043d\u044c \u043d\u0430\u0434\u0435\u0438\u043c\u0441\u044f \u0438 \u0432\u0435\u0440\u0438\u043c! \u0410 \u043f\u043e\u043a\u0430 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0435\u0433\u043e \u0434\u043e\u043a\u043b\u0430\u0434 \u0441 \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0435\u0433\u043e PyCon:\u0428\u0443\u0442\u043a\u0438 \u043f\u0440\u043e \u0441\u0431\u043e\u0440 \u043c\u0443\u0441\u043e\u0440\u0430 \u043f\u0430\u0439\u0442\u043e\u043d \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0441\u0435\u0445 \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 \u043d\u0430 \u0418\u0418 &#8212; \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445!msgspec\u041d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0440\u0435\u043b\u0438\u0437 0.22.0 \u0432\u0435\u0440\u0441\u0438\u0438!\u0412\u043d\u0443\u0442\u0440\u0438 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0439. \u042f \u0431\u044b \u0445\u043e\u0442\u0435\u043b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043d\u0430 \u043e\u0434\u043d\u043e\u043c (\u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435). \u041f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u0440\u043e \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 dataclass \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0437\u0430 \u0441\u0447\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u0438\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f __dataclass_field__ \u0438\u0437 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043a\u043e\u0434 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:\/\/ \u0411\u044b\u043b\u043e:PyObject *fields = PyObject_GetAttr(obj, self-&gt;mod-&gt;str___dataclass_fields__);\u0410 \u0432\u043e\u0442 \u0442\u0430\u043a \u0441\u0442\u0430\u043b\u043e:static MS_INLINE PyObject *ms_type_lookup_ref(PyTypeObject *type, PyObject *name) {#if PY313_PLUS    return _PyType_LookupRef(type, name);#else    PyObject *out = _PyType_Lookup(type, name);    Py_XINCREF(out);    return out;#endif}static PyObject *ms_get_dataclass_fields(MsgspecState *mod, PyTypeObject *type, PyObject *obj) {    PyObject *fields = ms_type_lookup_ref(type, mod-&gt;str___dataclass_fields__);    if (fields == NULL) return NULL;    if (MS_LIKELY(        PyDict_CheckExact(fields) &amp;&amp;        type-&gt;tp_getattro == PyObject_GenericGetAttr    )) {        return fields;    }    Py_DECREF(fields);    fields = PyObject_GetAttr(obj, mod-&gt;str___dataclass_fields__);    if (fields == NULL) PyErr_Clear();    return fields;}\/\/ \u0421\u0442\u0430\u043b\u043e:PyObject *fields = ms_get_dataclass_fields(self-&gt;mod, type, obj);\u0427\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c? \u0420\u0430\u043d\u044c\u0448\u0435 \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 __dataclass_fields__ \u043f\u0440\u044f\u043c\u043e \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430, \u0447\u0442\u043e \u0447\u0430\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u043e python \u043a\u043e\u0434 \u0432 __getattr__ \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430. \u0422\u0435\u043f\u0435\u0440\u044c, \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 type(instance).__dataclass_fields__, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u0435\u0440\u043d\u0443\u043b\u043e\u0441\u044c (\u0438\u043b\u0438 \u0432\u0435\u0440\u043d\u0443\u043b\u043e\u0441\u044c \u043d\u0435 \u0442\u043e), \u0442\u043e \u043c\u044b \u0438\u0434\u0435\u043c \u043d\u0430 \u0441\u0442\u0430\u0440\u044b\u0439 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u0443\u0442\u044c. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442?\u041a\u0430\u043a\u0438\u0435-\u0442\u043e \u043a\u0435\u0439\u0441\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0438\u0441\u044c \u0430\u0436 \u043d\u0430 73%, \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 5%\u041a\u0440\u0443\u0442\u043e? \u041a\u0440\u0443\u0442\u043e. \u0421\u0442\u0430\u0440\u0430\u0439\u0442\u0435\u0441\u044c \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a \u0432 \u0432\u0430\u0448\u0435\u043c C-API \u043a\u043e\u0434\u0435, \u0438\u0437\u0431\u0435\u0433\u0430\u0439\u0442\u0435 PyObject_GetAttr \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e.\u0420\u0435\u043b\u0438\u0437 \u0432\u044b\u0448\u0435\u043b \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u043c, \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e! \u0415\u0441\u043b\u0438 \u0435\u0449\u0435 \u043d\u0435 \u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 msgspec &#8212; \u0441\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f!\u041e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435: \u0414\u043e\u0432\u043e\u043b\u044c\u043d\u044b \u043b\u0438 \u0432\u044b \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c pydantic? \u0417\u0430\u043c\u0435\u0447\u0430\u0435\u0442\u0435 \u043b\u0438 \u0432\u044b \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445?django-modern-rest\u0421\u0430\u043c\u044b\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0431\u043b\u043e\u043a \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u0431\u044b\u043b \u0442\u0443\u0442! \u0417\u0430 \u043c\u0435\u0441\u044f\u0446 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0432\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0440\u0435\u043b\u0438\u0437\u0430 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 #opensource_september, \u0431\u044b\u043b\u043e \u0442\u0430\u043a\u043e\u0435 \u0441\u043e\u043e\u0431\u044b\u0442\u0438\u0435 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043d\u0435\u0433\u043e:\u0421\u043e\u0437\u0434\u0430\u043d\u043e 92 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430 GithHub\u0418\u0437 \u043d\u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u043e 85\u0414\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u0430 \u0446\u0438\u0444\u0440\u0430 \u0432 150 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0440\u0438\u0431\u044c\u044e\u0442\u043e\u0440\u043e\u0432\u041f\u043e\u0447\u0442\u0438 50 \u043d\u043e\u0432\u044b\u0445 \u043a\u043e\u043d\u0442\u0440\u0438\u0431\u044c\u044e\u0442\u043e\u0440\u043e\u0432 \u0437\u0430 \u043c\u0435\u0441\u044f\u0446\u041e\u0441\u043e\u0431\u0443\u044e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u041e\u043b\u044c\u0433\u0435 \u041f\u0438\u0447\u0443\u0436\u043a\u0438\u043d\u043e\u0439 \u0437\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0432\u043a\u043b\u0430\u0434 \u0432 \u043e\u0431\u0430 \u0440\u0435\u043b\u0438\u0437\u0430.\u0420\u0435\u043b\u0438\u0437 0.15.0\u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.\u0421\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435: \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043b\u0435\u043d\u0438\u0432\u044b\u0435 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u0440\u0430\u0445, \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0443\u0436\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u0440\u0435, \u0447\u0442\u043e \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u043d\u044f\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u043c\u0435\u0442\u0430-\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043d\u0430\u043b\u0435\u0442\u0443: class LoginController(Controller[_SerializerT]):    status_code: ClassVar[HTTPStatus] = HTTPStatus.OK    @classmethod    def lazy_spec(cls) -&gt; ModifyAnyCallable:        return modify(status_code=cls.status_code)    @modify.lazy(lazy_spec)    def get(self) -&gt; str:        return &#8216;login&#8217;class CreatedLogin(LoginController[PydanticSerializer]):    status_code = HTTPStatus.CREATED\u0422\u0435\u043f\u0435\u0440\u044c CreatedLogin \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0430\u0442\u0443\u0441 \u043a\u043e\u0434 \u0434\u043b\u044f \u043e\u0442\u0432\u0435\u0442\u043e\u0432. \u0423\u0434\u043e\u0431\u043d\u043e!\u0420\u0435\u043b\u0438\u0437 0.16.0\u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.\u0421\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435: \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0441\u0442\u0430\u043b \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445. \u0412\u043e\u0442 \u0441\u0432\u043e\u0431\u0434\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430.\u041c\u044b \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u0443\u0441\u043a\u043e\u0440\u044f\u0442\u044c django-modern-rest!\u041f\u043e \u043d\u0430\u0448\u0438\u043c \u0431\u0435\u043d\u0447\u0430\u043c \u043c\u044b \u0443\u0436\u0435 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 FastAPI (\u0433\u0434\u0435-\u0442\u043e \u0447\u0443\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0433\u0434\u0435-\u0442\u043e \u0447\u0443\u0442\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u0435\u0435). \u0414\u0430\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0435\u0442 \u0435\u0449\u0435 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0435\u0449\u0435 \u043b\u0443\u0447\u0448\u0435, \u0435\u0449\u0435 \u0443\u0434\u043e\u0431\u043d\u0435\u0435. \u0418 FastAPI \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0430\u043f\u044b\u0432\u0430\u0442\u044c!\u0412\u043d\u0443\u0442\u0440\u0438 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e:\u041f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043d\u0430\u0434 DX\u0423\u043b\u0443\u0447\u0448\u0438\u043b\u0438 AI \u0442\u0443\u043b\u0438\u043d\u0433 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\u041a\u0440\u0430\u0442\u043d\u043e \u043f\u0440\u043e\u043a\u0430\u0447\u0430\u043b\u0438 OpenAPI \u0441\u0445\u0435\u043c\u0443 \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c \u0434\u0430\u0436\u0435 x- \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0432 \u0442\u0438\u043f\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u043c API!\u041f\u0440\u043e\u0432\u0435\u043b\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043d\u044b\u0439 \u0430\u0443\u0434\u0438\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438\u0423\u043b\u0443\u0447\u0448\u0438\u043b\u0438 API \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u041a\u043e\u043b\u043b\u0435\u0433\u0438 \u0438\u0437 core-\u043a\u043e\u043c\u0430\u043d\u0434\u044b django-modern-rest \u0434\u043e\u043b\u043e\u0436\u0438\u043b\u0438\u0441\u044c \u043d\u0430 PyCon \u043e \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435:\u041e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435: \u041a\u0430\u043a\u0438\u0435 \u0444\u0438\u0447\u0438 \u0432\u044b \u0431\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u043d\u043e\u0432\u044b\u0445 \u0440\u0435\u043b\u0438\u0437\u0430\u0445 django-modern-rest?pustota\u0420\u0435\u043b\u0438\u0437\u043d\u0443\u043b\u0438 \u0442\u0435\u043c\u0443 pustota \u0434\u043b\u044f codex, \u0432\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b:pustota \u0434\u043b\u044f vscode: https:\/\/github.com\/pustota-theme\/pustota\u0410 \u0432\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 pustota.codex:https:\/\/github.com\/pustota-theme\/pustota.codex\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0443 \u0437\u0430 \u0442\u0435\u043c\u0443! \u041e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435: \u041d\u0440\u0430\u0432\u044f\u0442\u0441\u044f \u043b\u0438 \u0432\u0430\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u044b\u0435 \u0442\u0435\u043c\u044b? \u041a\u0430\u043a\u0438\u0435 \u0432\u0430\u0448\u0438 \u043b\u044e\u0431\u0438\u043c\u044b\u0435?\u041f\u0440\u043e\u0435\u043a\u0442\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 DTO (pydantic \/ adaptix \/ dataclasses) \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 JSON \u043f\u043e\u043b\u044f \u0432 Django \u043c\u043e\u0434\u0435\u043b\u044f\u0445: https:\/\/github.com\/skv0zsneg\/django-dto-field Yara ORM \u2014 async ORM \u0434\u043b\u044f Python \u0441 \u0434\u0432\u0438\u0436\u043a\u043e\u043c \u043d\u0430 Rust. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0439 Django\/Tortoise API, \u043d\u043e \u0447\u0442\u043e\u0431\u044b \u0433\u043e\u0440\u044f\u0447\u0438\u0439 \u043f\u0443\u0442\u044c (\u043f\u0443\u043b, \u0431\u0438\u043d\u0434\u0438\u043d\u0433, \u0434\u0435\u043a\u043e\u0434\u0438\u043d\u0433 \u0441\u0442\u0440\u043e\u043a) \u043a\u0440\u0443\u0442\u0438\u043b\u0441\u044f \u0432 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \u043d\u0430 Rust: https:\/\/github.com\/vsdudakov\/yara-ormFastAdmin &#8212; \u0430\u0434\u043c\u0438\u043d\u043a\u0430 \u0432 \u0434\u0443\u0445\u0435 Django Admin, \u043d\u043e \u0434\u043b\u044f FastAPI, Flask \u0438 Django, \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 orm &#8212;\u00a0 Tortoise, Django ORM, SQLAlchemy, Pony \u0438\u043b\u0438 Yara ORM: https:\/\/github.com\/vsdudakov\/fastadminYara Code \u2014 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043f\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043a\u043e\u0434\u0438\u043d\u0433-\u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438 (Claude Code, Codex, Cursor CLI): https:\/\/github.com\/vsdudakov\/yara-code \u0421\u043a\u0438\u043b\u043b \u0434\u043b\u044f Claude Code \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u0438\u0441\u0430\u0442\u044c \u043b\u0443\u0447\u0448\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430 Go. \u0412\u043d\u0443\u0442\u0440\u0438 \u2014 \u0432\u044b\u0436\u0438\u043c\u043a\u0430 \u0438\u0437 13 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432: \u0433\u0430\u0439\u0434\u044b Google \u0438 Uber, \u0447\u0435\u0442\u044b\u0440\u0435 Go-\u0441\u043a\u0438\u043b\u043b\u0430 \u0438 \u0447\u0435\u0442\u044b\u0440\u0435 \u0434\u043e\u043d\u043e\u0440\u0430 \u043f\u043e \u0430\u0433\u0435\u043d\u0442\u0430\u043c \u0438 MCP. \u0412\u0441\u0451 \u0441\u0432\u0435\u0434\u0435\u043d\u043e \u0432 \u043e\u0434\u0438\u043d \u043d\u0435\u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0432\u044b\u0439 \u0441\u0432\u043e\u0434 \u0441 \u044f\u0432\u043d\u043e\u0439 \u043b\u0435\u0441\u0442\u043d\u0438\u0446\u0435\u0439 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u0432, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0430\u0445 \u043f\u043e\u0431\u0435\u0436\u0434\u0430\u0435\u0442 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430, \u0430 \u043d\u0435 \u043b\u0438\u043d\u0442\u0435\u0440: https:\/\/github.com\/Djarvur\/go-ultimate Rust \u0431\u0435\u043a\u0435\u043d\u0434 \u0434\u043b\u044f Asr \u0434\u043b\u044f GigaAm v3: https:\/\/github.com\/deeray-ltd\/gigaam-v3-runtime \u041a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 MQTT (\u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 IoT): https:\/\/github.com\/faststream-community\/zMQTT \u0414\u043b\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043d\u0443\u0436\u0434 \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u043f\u0430\u0442\u0447\u0438, \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0432\u044b\u043a\u0430\u0442\u0438\u043b \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u0443\u044e \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0430\u0442\u0447\u0435\u0439 (\u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c). \u041c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b: https:\/\/github.com\/tochka-public\/bitcut DB STAT \u2014 \u044d\u0442\u043e \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 PostgreSQL, Greenplum \u0438 Greengage. \u0412 \u043e\u0434\u043d\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445, \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0442\u0430\u0431\u043b\u0438\u0446, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438, \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u0441\u0435\u0441\u0441\u0438\u0438 \u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438: https:\/\/github.com\/OlegEgoism\/DB_STAT C\u043e\u0442\u043d\u0438 \u043d\u0430\u0432\u044b\u043a\u043e\u0432 \u0443 \u0430\u0433\u0435\u043d\u0442\u0430 \u0431\u0435\u0437 \u0440\u0430\u0437\u0434\u0443\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u043c\u043f\u0442\u0430, \u0432 4,4 \u0440\u0430\u0437\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0442\u043e\u043a\u0435\u043d\u043e\u0432: 113k \u2192 25,8k \u0437\u0430 \u0445\u043e\u0434 \u043d\u0430 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u0438\u0437 236 \u043d\u0430\u0432\u044b\u043a\u043e\u0432: https:\/\/github.com\/deyna256\/langchain-skill-router\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0430 Python, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0438 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0415\u0435 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 @appoint_limit_async \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u043e\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0433\u043e\u043d\u043a\u0438 \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0447\u0442\u043e \u043a\u0440\u0430\u0439\u043d\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043b\u0438\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 API: https:\/\/gitlab.com\/asurnovsurnov\/asynctoolspy \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 k8s cluster \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439: https:\/\/github.com\/prostoLavr\/libvirtd-tf-infraMarkdown Preview Editor \u2014 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 Markdown \u0441 \u0436\u0438\u0432\u044b\u043c \u043f\u0440\u0435\u0434\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u043c, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435: \u0444\u0430\u0439\u043b\u044b \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f, \u0431\u044d\u043a\u0435\u043d\u0434\u0430 \u043d\u0435\u0442. \u0423\u043c\u0435\u0435\u0442 GFM, \u0444\u043e\u0440\u043c\u0443\u043b\u044b,&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-497571","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/497571","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=497571"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/497571\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=497571"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=497571"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=497571"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}