{"id":351773,"date":"2024-05-20T21:55:33","date_gmt":"2024-05-20T21:55:33","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=351773"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-05-20T21:55:33","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=351773","title":{"rendered":"<span>\u042f \u043b\u044e\u0431\u043b\u044e \u043f\u0438\u0442\u043e\u043d, \u0438 \u0432\u043e\u0442 \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d \u043c\u0435\u043d\u044f \u0431\u0435\u0441\u0438\u0442<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/32e\/f2d\/4fd\/32ef2d4fdbcb9b0c57417f27472dc410.jpg\" width=\"800\" height=\"400\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/32e\/f2d\/4fd\/32ef2d4fdbcb9b0c57417f27472dc410.jpg\" data-blurred=\"true\"\/><\/figure>\n<p>\u0412\u0430\u0441 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0430\u0448 \u0437\u0430\u043d\u0443\u0434\u0430!<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u043b\u0435\u0434\u0438\u0442\u0435 \u0437\u0430 \u043c\u043e\u0435\u0439 \u043b\u0435\u043d\u0438\u0432\u043e\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e, \u0442\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438 \u0431\u044b, \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u043c\u043d\u043e\u0433\u043e \u043e\u0442 \u0447\u0435\u0433\u043e \u043f\u0440\u0438\u0433\u043e\u0440\u0430\u0435\u0442. \u0412\u043e\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<ul>\n<li>\n<p>\u0423 \u043c\u0435\u043d\u044f \u043f\u0440\u0438\u0433\u043e\u0440\u0430\u0435\u0442 \u043e\u0442 \u043d\u0438\u0437\u043a\u043e\u0441\u043e\u0440\u0442\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u043f\u043e\u0442\u043e\u043a\u0435: <a href=\"https:\/\/habr.com\/ru\/post\/647515\/\" rel=\"noopener noreferrer nofollow\">\u041f\u0438\u0442\u043e\u043d \u043f\u0440\u043e\u0442\u0438\u0432 \u0411\u0435\u0437\u0443\u043c\u043d\u043e\u0433\u043e \u041c\u0430\u043a\u0441\u0430, \u0438\u043b\u0438 \u043a\u0430\u043a \u044f \u043f\u043e\u0441\u0442\u044b \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0437\u0430\u043c\u043e\u0440\u0430\u0436\u0438\u0432\u0430\u043b<\/a><\/p>\n<\/li>\n<li>\n<p>\u0423 \u043c\u0435\u043d\u044f \u043f\u0440\u0438\u0433\u043e\u0440\u0430\u0435\u0442 \u043e\u0442 Django: <a href=\"https:\/\/habr.com\/ru\/post\/594601\/\" rel=\"noopener noreferrer nofollow\">\u041e\u043a\u0435\u0439, \u0414\u0436\u0430\u043d\u0433\u043e, \u0443 \u043c\u0435\u043d\u044f \u043a \u0442\u0435\u0431\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p>\u0418 \u043e\u0442 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 \u0442\u043e\u0436\u0435: <a href=\"https:\/\/habr.com\/ru\/post\/550088\/\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u042f\u043d\u0434\u0435\u043a\u0441: \u0442\u0435\u0430\u0442\u0440 \u0430\u0431\u0441\u0443\u0440\u0434\u0430 :\/<\/a><\/p>\n<\/li>\n<li>\n<p>\u0418 \u043e\u0442 \u0440\u0435\u043a\u0440\u0443\u0442\u0435\u0440\u043e\u0432: <a href=\"https:\/\/habr.com\/ru\/post\/534902\/\" rel=\"noopener noreferrer nofollow\">\u042f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u0437 1400, \u0438\u043b\u0438 \u0441\u0430\u043c\u044b\u0439 \u043a\u0440\u0443\u0442\u043e\u0439 \u0440\u0435\u043a\u0440\u0443\u0442\u0438\u043d\u0433, \u0447\u0442\u043e \u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0448\u044c \u0442\u0430\u043a &#8212; \u044f \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0441\u0433\u043e\u0440\u0435\u0442\u044c. \u041d\u043e \u044f, \u0430\u043a\u0438 \u0444\u0435\u043d\u0438\u043a\u0441, \u0432\u043e\u0437\u0440\u043e\u0436\u0434\u0430\u044e\u0441\u044c, \u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0443 \u043c\u0435\u043d\u044f \u0433\u043e\u0440\u0438\u0442 \u043e\u0442, \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e, \u041f\u0438\u0442\u043e\u043d\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u043f\u0438\u0448\u0443 \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0435\u0441\u044f\u0442\u0438 \u043b\u0435\u0442. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u0436\u0435, \u043f\u043e \u043c\u043e\u0435\u043c\u0443 \u043c\u043d\u0435\u043d\u0438\u044e, \u0441 \u043d\u0438\u043c \u043d\u0435 \u0442\u0430\u043a &#8212; \u0442\u043e \u043f\u0440\u043e\u0448\u0443 \u043f\u043e\u0434 \u043a\u0430\u0442.<\/p>\n<h2>GIL \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c<\/h2>\n<p>\u0410 \u0432\u043e\u0442 \u0438 \u043d\u0435\u0442! \u0417\u0434\u0435\u0441\u044c \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e GIL \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u0428\u0430\u0445 \u0438 \u043c\u0430\u0442, \u0445\u0435\u0439\u0442\u0435\u0440\u044b \u043f\u0438\u0442\u043e\u043d\u0430 ? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e &#8212; \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u043e &#8212; \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u044d\u0442\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 <s>\u0438 \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0432\u0438\u043d\u0443 \u043d\u0430 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u0438\u0442\u043e\u043d<\/s>. \u0423 \u043c\u0435\u043d\u044f \u0443\u0436\u0435 \u043b\u0435\u0442 5 \u043f\u043e\u0434 \u0431\u043e\u043a\u043e\u043c \u043b\u0435\u0436\u0438\u0442 nim, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u043c\u043e\u0433\u0443 \u0437\u0430 \u043c\u0438\u043d\u0443\u0442\u044b \u043d\u0430\u043a\u0438\u0434\u0430\u0442\u044c \u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u0443\u043f\u0435\u0440-\u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u043f\u043e-\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 \u043a\u043e\u0434. \u0418 \u044f \u0434\u0430\u0436\u0435 \u043c\u043e\u0433\u0443 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0438\u0437 \u043f\u0438\u0442\u043e\u043d\u0430 \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442. \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u044f \u044d\u0442\u0438\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f? \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, 0. \u0422\u0430\u043a\u043e\u0435 \u0432\u043e\u0442 \u0441\u0443\u0433\u0443\u0431\u043e \u043b\u0438\u0447\u043d\u043e\u0435 \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u0438\u0435 \u043f\u0438\u0442\u043e\u043d\u0430. \u041d\u0443 \u0438 nogil \u043a\u043e\u0433\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c <a href=\"https:\/\/discuss.python.org\/t\/a-steering-council-notice-about-pep-703-making-the-global-interpreter-lock-optional-in-cpython\/30474\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0438\u043b\u0435\u0442\u0438\u0442 \u0432 \u043d\u0430\u0448\u0435 \u0446\u0430\u0440\u0441\u0442\u0432\u043e<\/a>. \u041d\u043e \u043c\u044b \u0436\u0435 \u0441\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0435 \u0437\u0430 \u044d\u0442\u0438\u043c, \u0434\u0430?<\/p>\n<h2>\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b<\/h2>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/bb0\/b23\/1b5\/bb0b231b5483b0bffdcad1478e88dce5.jpg\" alt=\"\u041d\u0443 \u043f\u043e\u0447\u0442\u0438 \u0442\u0430\u043a\u0438\u0435, \u0434\u0430\" title=\"\u041d\u0443 \u043f\u043e\u0447\u0442\u0438 \u0442\u0430\u043a\u0438\u0435, \u0434\u0430\" width=\"1893\" height=\"629\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bb0\/b23\/1b5\/bb0b231b5483b0bffdcad1478e88dce5.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u041d\u0443 \u043f\u043e\u0447\u0442\u0438 \u0442\u0430\u043a\u0438\u0435, \u0434\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0442\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0432 \u043f\u0438\u0442\u043e\u043d\u0435, \u0442\u043e\u0442 \u0435\u0449\u0451 \u044e\u043d\u0435\u0446!  \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0431\u044b\u043b\u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043a\u043e\u0431\u043a\u0438 \u0432 \u0432\u044b\u0437\u043e\u0432\u0430\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<pre><code class=\"python\"># \u041a\u0440\u0430\u0441\u0438\u0432\u043e? \u041a\u0440\u0430\u0441\u0438\u0432\u043e! sorted(element.value for element in elements)  # ... \u0445\u043e\u0442\u044f \u0441\u0442\u043e\u0438\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, \u0438 \u0441\u043a\u043e\u0431\u043a\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438. \u041a\u0430\u043a\u043e\u0433\u043e \u0445\u0440\u0435\u043d\u0430?! sorted((element.value for element in elemens), key=attrgetter('attr'))<\/code><\/pre>\n<p>\u0410, \u0447\u0443\u0442\u044c \u043d\u0435 \u0437\u0430\u0431\u044b\u043b &#8212; \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0435\u0449\u0451 \u044d\u043a\u043e\u043d\u043e\u043c\u044f\u0442 \u043f\u0430\u043c\u044f\u0442\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435 \u0432\u044b\u0432\u0430\u043b\u0438\u0432\u0430\u044e\u0442 \u0432\u0441\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043b\u0435\u0442\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043d\u0435 \u0432\u0441\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0438\u0437 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e&#8230;<\/p>\n<h3>\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043e\u0442\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430<\/h3>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u043d\u0430\u0442\u044c, \u0433\u0434\u0435 \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d &#8212; \u0442\u0430 \u0435\u0449\u0451 \u0437\u0430\u0434\u0430\u0447\u0430. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 <a href=\"https:\/\/habr.com\/ru\/company\/timeweb\/blog\/723600\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>:<\/p>\n<pre><code class=\"python\">try: quota_chunks = quota_cache.apply(quota_chunks) except InconsistentQuotaCache: log.error('Something went wrong') raise  # \u0410 InconsistentQuotaCache \u0432\u044b\u043a\u0438\u043d\u0443\u043b\u043e\u0441\u044c \u043d\u0430 \u0432\u043e\u0442 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435! \u0425\u0430-\u0445\u0430! first_quota_chunks, quota_chunks = spy(quota_chunks, 1)<\/code><\/pre>\n<h3>\u041e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430<\/h3>\n<p>\u0412 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0443 \u043c\u0435\u043d\u044f \u0431\u044b\u043b\u043e \u0434\u0432\u0430 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0438\u0445 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u043b\u0438\u0442\u044c \u0432 \u043e\u0434\u0438\u043d \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e \u043d\u043e\u043c\u0435\u0440\u043e\u0432. \u0422\u0438\u043f\u0430 <code>a1, a2, a5, a6, ...<\/code> + <code>b2, b4, b5, b8, ...<\/code> -> <code>a1, a2, b2, b4, a5, b5, a6, b8, ...<\/code>. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 <code>A<\/code> \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 <code>B<\/code> \u043f\u043e\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0432\u0445\u043e\u0434 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0443-\u0441\u043b\u0438\u0432\u0430\u0442\u043e\u0440\u0443, \u0438 \u043e\u043d \u0441\u0430\u043c \u043a\u0443\u0434\u0430-\u0442\u043e \u0442\u0430\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f. \u042d\u0442\u043e \u044f \u0432\u0430\u043c \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043b <code>a1, a2, b2<\/code> \u0438 \u0432\u0440\u043e\u0434\u0435 \u0432\u0441\u0451 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043d\u043e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432\u0438\u0434\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0438 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b &#171;\u043e\u0442\u043a\u0443\u0434\u0430 \u043e\u043d\u043e \u043f\u0440\u0438\u0448\u043b\u043e&#187;, &#171;\u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0440\u0430\u043d\u044c\u0448\u0435&#187; \u0438 &#171;\u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u043b\u044c\u0448\u0435&#187; \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u043b\u0435\u0433\u043a\u043e \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c. \u0421\u0440\u0430\u0432\u043d\u0438\u0442\u0435:<\/p>\n<pre><code class=\"python\">A = ['a1', 'a2'] B = ['b2', 'b4'] merged = sorted(A + B, key=lambda item: int(item[1:]))  print('\u0412\u043e\u0442 \u0432\u0441\u0451 \u0447\u0442\u043e \u0435\u0441\u0442\u044c:', merged)  for i, item in enumerate(merged): print('\u0411\u044b\u043b\u043e:', merged[:i], '\u0429\u0430\u0441:', item, '\u0411\u0443\u0434\u0435\u0442:', merged[i+1:])  print('\u0414\u0430\u0432\u0430\u0439 \u0435\u0449\u0451 \u0440\u0430\u0437 \u041d\u0430\u0441\u0442\u044f!') for i, item in enumerate(merged): print('\u0411\u044b\u043b\u043e:', merged[:i], '\u0429\u0430\u0441:', item, '\u0411\u0443\u0434\u0435\u0442:', merged[i+1:])  # \u0412\u043e\u0442 \u0432\u0441\u0451 \u0447\u0442\u043e \u0435\u0441\u0442\u044c: ['a1', 'a2', 'b2', 'b4'] # \u0411\u044b\u043b\u043e: [] \u0429\u0430\u0441: a1 \u0411\u0443\u0434\u0435\u0442: ['a2', 'b2', 'b4'] # \u0411\u044b\u043b\u043e: ['a1'] \u0429\u0430\u0441: a2 \u0411\u0443\u0434\u0435\u0442: ['b2', 'b4'] # \u0411\u044b\u043b\u043e: ['a1', 'a2'] \u0429\u0430\u0441: b2 \u0411\u0443\u0434\u0435\u0442: ['b4'] # \u0411\u044b\u043b\u043e: ['a1', 'a2', 'b2'] \u0429\u0430\u0441: b4 \u0411\u0443\u0434\u0435\u0442: [] # \u0414\u0430\u0432\u0430\u0439 \u0435\u0449\u0451 \u0440\u0430\u0437 \u041d\u0430\u0441\u0442\u044f! # \u0411\u044b\u043b\u043e: [] \u0429\u0430\u0441: a1 \u0411\u0443\u0434\u0435\u0442: ['a2', 'b2', 'b4'] # \u0411\u044b\u043b\u043e: ['a1'] \u0429\u0430\u0441: a2 \u0411\u0443\u0434\u0435\u0442: ['b2', 'b4'] # \u0411\u044b\u043b\u043e: ['a1', 'a2'] \u0429\u0430\u0441: b2 \u0411\u0443\u0434\u0435\u0442: ['b4'] # \u0411\u044b\u043b\u043e: ['a1', 'a2', 'b2'] \u0429\u0430\u0441: b4 \u0411\u0443\u0434\u0435\u0442: []<\/code><\/pre>\n<p>vs<\/p>\n<pre><code class=\"python\">A = ('a1', 'a2') B = ('b2', 'b4')              merged = merge_iter(A, B, key=lambda item: int(item[1:]))  print('\u0412\u043e\u0442 \u0432\u0441\u0451 \u0447\u0442\u043e \u0435\u0441\u0442\u044c:', merged)  for i, item in enumerate(merged):     print('\u0411\u044b\u043b\u043e:', '\u0445\u0437', '\u0429\u0430\u0441:', item, '\u0411\u0443\u0434\u0435\u0442:', '\u0445\u0437')  print('\u0414\u0430\u0432\u0430\u0439 \u0435\u0449\u0451 \u0440\u0430\u0437 \u041d\u0430\u0441\u0442\u044f!') for i, item in enumerate(merged):     print('\u0411\u044b\u043b\u043e:', '\u0445\u0437', '\u0429\u0430\u0441:', item, '\u0411\u0443\u0434\u0435\u0442:', '\u0445\u0437')  # \u0412\u043e\u0442 \u0432\u0441\u0451 \u0447\u0442\u043e \u0435\u0441\u0442\u044c: &lt;generator object merge_iter at 0x7f22c81cac70> # \u0411\u044b\u043b\u043e: \u0445\u0437 \u0429\u0430\u0441: a1 \u0411\u0443\u0434\u0435\u0442: \u0445\u0437 # \u0411\u044b\u043b\u043e: \u0445\u0437 \u0429\u0430\u0441: a2 \u0411\u0443\u0434\u0435\u0442: \u0445\u0437 # \u0411\u044b\u043b\u043e: \u0445\u0437 \u0429\u0430\u0441: b2 \u0411\u0443\u0434\u0435\u0442: \u0445\u0437 # \u0411\u044b\u043b\u043e: \u0445\u0437 \u0429\u0430\u0441: b4 \u0411\u0443\u0434\u0435\u0442: \u0445\u0437 # \u0414\u0430\u0432\u0430\u0439 \u0435\u0449\u0451 \u0440\u0430\u0437 \u041d\u0430\u0441\u0442\u044f!<\/code><\/pre>\n<h3>\u041a\u0430\u043a \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c<\/h3>\n<p>\u041c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0432\u043e\u0439\u0442\u0438 <s>\u0432 \u0442\u0443 \u0436\u0435 \u0440\u0435\u043a\u0443<\/s> \u0432 \u0442\u043e\u0442 \u0436\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u043b \u0441\u0435\u0431\u044f, \u0430 \u043f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u0435 \u043d\u0435 \u0443\u043f\u0430\u043b, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0432\u0435\u0440\u043d\u0443\u043b \u043d\u0438\u0447\u0435\u0433\u043e. \u0420\u0430\u0437\u0432\u0435 \u044d\u0442\u043e \u043d\u0435 \u044d\u043f\u0438\u0447\u043d\u043e?<\/p>\n<p>\u042f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043f\u043e\u043f\u0430\u0434\u0430\u043b\u0441\u044f \u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0435, \u043a\u043e\u0433\u0434\u0430 \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u043f\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0443 \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437. \u0418\u043d\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u0431\u044b\u043b\u0438 \u043c\u043e\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u0430 \u0438\u043d\u043e\u0433\u0434\u0430 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0443\u043c\u043d\u0438\u043a \u0440\u0435\u0448\u0430\u043b, \u0447\u0442\u043e \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0432\u0441\u0451 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c memory-efficient, \u0438 \u0442\u0430\u043c, \u0433\u0434\u0435 \u044f \u043e\u0436\u0438\u0434\u0430\u043b \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043c\u0435\u043d\u044f \u0436\u0434\u0430\u043b \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440. \u041e\u043d\u0438, \u0431\u043b\u0438\u043d, \u0432\u043d\u0435\u0448\u043d\u0435 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f!<\/p>\n<p>\u041d\u0443 \u0438 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0442\u0430\u043a \u043b\u0438\u0445\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f. \u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0432 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a, \u0430 \u0442\u0430\u043c \u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>&lt;generator object fuck_you at 0x7f22c81cac70><\/code> &#8212; \u0438 \u0447\u043e \u0441 \u044d\u0442\u0438\u043c \u0434\u0435\u043b\u0430\u0442\u044c? \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435, \u0442\u043e \u043e\u043d \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u0435\u0442\u0441\u044f, \u0438 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0435\u0433\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<h2>\u041d\u0438\u043a\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442<\/h2>\n<p>\u041f\u0438\u0442\u043e\u043d \u0441\u043b\u0438\u0448\u043a\u043e\u043c&#8230; \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439, \u0447\u0442\u043e \u043b\u0438.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044f \u043c\u043e\u0433\u0443 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c \u043f\u0440\u044f\u043c \u0432 \u0442\u0435\u043b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"python\">def foo():     from bar import baz baz() <\/code><\/pre>\n<p>\u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u044d\u0442\u043e \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043f\u0440\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 &#8212; \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u0438\u043c\u043f\u043e\u0440\u0442 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 <code>bar<\/code> \u0447\u0442\u043e-\u0442\u043e \u043f\u043b\u043e\u0445\u043e, \u0442\u043e \u0443\u0437\u043d\u0430\u0435\u043c \u043c\u044b \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u043c\u043f\u043e\u0440\u0442\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 <code>foo()<\/code>, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 &#8212; \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435.<\/p>\n<p>\u0415\u0449\u0451 \u043c\u043e\u0436\u043d\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u0443\u0433\u043e\u0434\u043d\u043e. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0438\u0436\u0435 \u043f\u043e\u043b\u0437\u0451\u043c \u043f\u043e \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0451, \u0447\u0442\u043e \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u0440\u0443\u043a\u0443, \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438. \u041e\u0447\u0435\u043d\u044c \u0433\u0438\u0431\u043a\u043e, \u043d\u043e \u0438 \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e. IDE \u0432 \u0448\u043e\u043a\u0435!<\/p>\n<pre><code class=\"python\">from importlib import import_module from pathlib import Path  for file in Path(__file__).parent.iterdir():     if not (name := file.stem).startswith('_'):         module = import_module(f'.{name}', __package__)         symbols = [symbol for symbol in module.__dict__ if not symbol.startswith('_')]         globals().update({symbol: getattr(module, symbol) for symbol in symbols}) <\/code><\/pre>\n<p>\u0415\u0449\u0451 \u044f \u043f\u0440\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0435 \u043c\u043e\u0434\u0443\u043b\u044f \u043c\u043e\u0433\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043a\u043e\u0434 &#8212; \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 \u0435\u0441\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f:<\/p>\n<pre><code class=\"python\">def load_huge_table() -> pd.DataFrame:     return pd.read_excel('data_1000000000_rows.xlsx')  HUGE_TABLE = load_huge_table() <\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0443 \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c side effect, \u0438 \u043c\u043d\u0435, \u043a\u0430\u043a \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044e \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e, \u044d\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043f\u043e \u0434\u0443\u0448\u0435.<\/p>\n<p>\u0410 \u0435\u0449\u0451 \u044f \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u043e\u0433\u0443 \u043f\u043e\u0447\u0442\u0438 \u043b\u044e\u0431\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442. \u042f \u043f\u043e\u043c\u043d\u044e \u043f\u0430\u0440\u0443 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u0438\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u0443 &#171;\u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439&#187; \u0430\u0442\u0440\u0438\u0431\u0443\u0442. \u0420\u0443\u0431\u0440\u0438\u043a\u0430 &#171;\u043d\u0430\u0439\u0434\u0438 \u043e\u0448\u0438\u0431\u043a\u0443&#187;:<\/p>\n<pre><code class=\"python\">@app.task def terminate_stale_membership():     \"\"\" If there's no membership payment for a while, stop trying to charge. \"\"\"      stale_period = timedelta(days=60)     for premium in Premium.objects.active().not_paid():         log.debug(premium)         last_payment = premium.payments.filter(paid__isnull=False).latest('end')         now_ = now()         if not last_payment or last_payment.end &lt;= now_ - stale_period:             premium.ends = now_             premium.notes = f'[auto-disabled as stale @ {now_}]'             premium.save()             log.info('Disabled premium renewal for stale membership intent: %s', premium) <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0432\u043c\u0435\u0441\u0442\u043e <code>premium.ends = now_<\/code> \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b\u0442\u044c <code>premium.end = now_<\/code>. \u0412 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043c\u043d\u0435 \u0431\u044b \u0432\u0441\u044b\u043f\u0430\u043b \u0437\u0430 \u0442\u0430\u043a\u0438\u0435 \u0432\u044b\u043a\u0440\u0443\u0442\u0430\u0441\u044b, \u0430 \u0432 \u043f\u0438\u0442\u043e\u043d\u0435 &#8212; \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043c\u0441\u044f \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435!<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430:<\/p>\n<pre><code class=\"python\">class MyClass:     def __setattr__(self, attr, value):         print('Nope!')  obj = MyClass() obj.a = 1  # Nope! obj.a  # AttributeError: 'MyClass' object has no attribute 'a' <\/code><\/pre>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u043f\u0440\u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0438!<\/p>\n<p>\u0427\u0442\u043e \u0435\u0449\u0451 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u043f\u0438\u0442\u043e\u043d\u0435? \u041a\u0430\u043a\u0438\u0435-\u0442\u043e <a href=\"https:\/\/habr.com\/ru\/articles\/725340\/\" rel=\"noopener noreferrer nofollow\">\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u0430\u0431\u0440\u0438\u043a\u0438<\/a>. \u0418\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e <a href=\"https:\/\/habr.com\/ru\/companies\/oleg-bunin\/articles\/512650\/\" rel=\"noopener noreferrer nofollow\">\u043d\u0435\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0440\u0430\u0437\u0443\u043c\u043e\u043c \u0432\u0430\u0449\u0438<\/a>.<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u043f\u0438\u0442\u043e\u043d &#8212; \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439. \u041e\u0447\u0435\u043d\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439. \u0414\u0430\u0436\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c. \u041f\u043e \u043c\u043e\u0435\u043c\u0443 \u043e\u043f\u044b\u0442\u0443, \u0432 99% \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043c\u043d\u0435 \u044d\u0442\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0432\u043f\u0451\u0440\u043b\u0430\u0441\u044c &#8212; \u044f \u0437\u043d\u0430\u044e, \u043a\u0430\u043a\u0438\u0435 \u0433\u0434\u0435 \u0442\u0438\u043f\u044b \u043e\u0436\u0438\u0434\u0430\u044e\u0442\u0441\u044f \u0438 \u043a\u0430\u043a\u0438\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0443 \u043c\u043e\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043d\u043e \u044f \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u043b\u0430\u0447\u0443 \u0437\u0430 &#171;\u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c&#187; \u043f\u0438\u0442\u043e\u043d\u0430. \u041f\u043b\u0430\u0447\u0443 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<p>\u041f\u0438\u0442\u043e\u043d \u0447\u0442\u043e-\u0442\u043e \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f. \u0415\u0441\u0442\u044c type hints, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 IDE \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u043a\u0443 (\u043d\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0451), \u0435\u0441\u043b\u0438 <code>@dataclass(slots=True)<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u043d\u0435\u043c\u043d\u043e\u0433\u043e &#171;\u0441\u0442\u0440\u043e\u0436\u0435&#187; (\u043d\u043e \u0442\u0438\u043f\u044b \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0435 \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442, \u0445\u0430-\u0445\u0430), \u0435\u0441\u0442\u044c pydantic, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 <a href=\"https:\/\/stackoverflow.com\/questions\/50563546\/validating-detailed-types-in-python-dataclasses\/55910982#55910982\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0440\u0430\u0435\u0442\u0441\u044f<\/a> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0442\u0438\u043f\u044b, \u043d\u043e \u0432 \u0446\u0435\u043b\u043e\u043c \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0442\u0430\u043a\u0430\u044f: \u0435\u0441\u0442\u044c &#171;\u0441\u0442\u0440\u043e\u0433\u0438\u0435&#187; \u044f\u0437\u044b\u043a\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0445\u0440\u0435\u043d\u044c &#8212; \u043d\u0430\u0434\u043e \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f, \u0430 \u0435\u0441\u0442\u044c &#171;\u0425\u0425\u0438\u0412\u041f-\u044f\u0437\u044b\u043a\u0438&#187;, \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e\u0431\u044b <em>\u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0445\u0440\u0435\u043d\u044c<\/em>. \u041f\u0438\u0442\u043e\u043d, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b \u044f\u0437\u044b\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438 \u0441\u0442\u0440\u043e\u0433\u0438\u0435, \u0438 \u0433\u0438\u0431\u043a\u0438\u0435, \u0442\u043e \u043f\u043e\u0433\u043b\u044f\u0434\u0438\u0442\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u043d\u0430 <a href=\"https:\/\/nim-lang.org\" rel=\"noopener noreferrer nofollow\">nim<\/a> &#8212; \u0445\u043e\u0442\u044f \u0443 \u043d\u0435\u0433\u043e \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043f\u0440\u0430\u0432\u0434\u0430, \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0440\u043e\u0434\u0430.<\/p>\n<h2>Mutable defaults<\/h2>\n<p>\u0423 \u043c\u0435\u043d\u044f \u0433\u043e\u0440\u0438\u0442! \u041d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0437\u044f\u0442\u044c \u0438 \u0437\u0430\u0434\u0430\u0442\u044c, \u0441\u043a\u0430\u0436\u0435\u043c, \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430:<\/p>\n<pre><code class=\"python\">def foo(items: list[str] = []):     items.append(1)     print(items)  foo()  # [1] foo()  # [1, 1] foo()  # [1, 1, 1] <\/code><\/pre>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0435, \u0442\u0430\u043a \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, \u0442\u043e \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u0430\u0442\u0442\u0435\u0440\u043d &#171;\u044f \u0445\u043e\u0447\u0443 mutable default&#187;:<\/p>\n<pre><code class=\"python\">def foo(items: list[str] | None = None):     items = items or []  # \u0438\u043b\u0438 if items is None: items = []     items.append(1)     print(items)  foo()  # [1] foo()  # [1] foo()  # [1] <\/code><\/pre>\n<p>\u0412 \u0434\u0430\u0442\u0430\u043a\u043b\u0430\u0441\u0441\u0430\u0445 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0435\u0449\u0451 \u0443\u0436\u0430\u0441\u043d\u0435\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0437\u0433\u043b\u044f\u043d\u0438\u0442\u0435:<\/p>\n<pre><code class=\"python\">from dataclasses import dataclass, field  @dataclass class Foo:     items: list[str] = field(default_factory=list)  # &lt;-- \u0438 \u0432\u0441\u0451 \u044d\u0442\u043e - \u0447\u0442\u043e\u0431\u044b \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0431\u044b\u043b \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a <\/code><\/pre>\n<p>\u0421\u0440\u0430\u0432\u043d\u0438\u0442\u0435 \u044d\u0442\u043e \u0441 \u043f\u0438\u0434\u0430\u043d\u0442\u0438\u043a\u043e\u043c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0434\u0443\u043c\u0430\u044e\u0442 \u043e \u043b\u044e\u0434\u044f\u0445:<\/p>\n<pre><code class=\"python\">from pydantic import BaseModel  class Foo(BaseModel):     items: list[str] = [] <\/code><\/pre>\n<p>\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u043e\u0441\u043e\u0437\u043d\u0430\u043b, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f &#171;\u0447\u0438\u0441\u0442\u0430\u044f&#187;, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439:<\/p>\n<pre><code class=\"python\">def foo(var: int, checks: list[Callable] = []): for check in checks: check(var) <\/code><\/pre>\n<p>\u041d\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e &#171;\u043d\u043e&#187;:<\/p>\n<ol>\n<li>\n<p>\u041b\u0438\u043d\u0442\u0435\u0440\u0443 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u0442\u044c\u0441\u044f<\/p>\n<\/li>\n<li>\n<p>\u041a\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0440\u0435\u0448\u0438\u0442, \u0447\u0442\u043e \u0435\u043c\u0443 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0438 \u0432\u0441\u0451 \u0441\u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f<\/p>\n<\/li>\n<li>\n<p>\u0414\u0440\u0443\u0433\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431 \u043c\u043e\u0436\u0435\u0442 \u044d\u0442\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0438 \u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u044c, \u043f\u0440\u044f\u043c \u043a\u0430\u043a \u0432 \u043c\u0435\u043c\u0435:<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/6be\/e33\/7bc\/6bee337bc7e0907cc796eda071dc451d.jpg\" width=\"888\" height=\"499\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6be\/e33\/7bc\/6bee337bc7e0907cc796eda071dc451d.jpg\" data-blurred=\"true\"\/><\/figure>\n<h2>\u041d\u0435\u0442 const<\/h2>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432\u044b\u0448\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e \u0431\u044b, \u0435\u0441\u043b\u0438 \u0431\u044b \u0431\u044b\u043b <code>const<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043b: \u0432\u043e\u0442 \u044d\u0442\u0443 \u0448\u0442\u0443\u043a\u0443 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f. \u041d\u043e \u0432 \u043f\u0438\u0442\u043e\u043d\u0435 \u0442\u0430\u043a \u043d\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u043e. \u0412 \u043f\u0438\u0442\u043e\u043d\u0435 \u043a\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u0443\u0433\u043e\u0434\u043d\u043e.<\/p>\n<h2>\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b<\/h2>\n<p>\u042f \u043b\u044e\u0431\u043b\u044e, \u043a\u043e\u0433\u0434\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0437\u0430\u0434\u0430\u044e\u0442 \u043f\u043e \u0438\u043c\u0435\u043d\u0438:<\/p>\n<pre><code class=\"python\">call(me='maybe') <\/code><\/pre>\n<p>\u0421\u0440\u0430\u0437\u0443 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, <em>\u0447\u0442\u043e<\/em>, <em>\u043a\u043e\u0433\u043e<\/em> \u0438 <em>\u043a\u0430\u043a<\/em>.<\/p>\n<p>\u042f \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u043f\u0440\u043e\u0442\u0438\u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u0443 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"python\">max([1, 2, 3, 4, 5]) <\/code><\/pre>\n<p>\u041d\u043e \u0432 \u0446\u0435\u043b\u043e\u043c \u0438\u043c\u0435\u043d\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b (<code>kwargs<\/code>) \u0432\u0441\u0435\u0433\u0434\u0430 \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0445 (<code>args<\/code>):<\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u0438 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f: \u044f \u043c\u043e\u0433\u0443 \u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u0438 \u0432\u0441\u0451 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c<\/p>\n<\/li>\n<li>\n<p>\u041b\u0443\u0447\u0448\u0435 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0435 \u0432\u0430\u0448\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043a\u0430\u043a \u0433\u043e\u0431\u043b\u0438\u043d: \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u0435 <code>display(hehe, trololo)<\/code> vs <code>display(num_per_page=hehehe, items=trololo)<\/code> &#8212; \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0432 \u043f\u0438\u0442\u043e\u043d\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 <code>*<\/code> \u0438 <code>\/<\/code>, \u0447\u0442\u043e\u0431\u044b <em>\u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c<\/em> \u044e\u0437\u0430\u0442\u044c <code>args<\/code> \u0438\u043b\u0438 <code>kwargs<\/code>! \u042f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u043f\u0440\u043e\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443, \u043d\u043e \u043d\u0435 \u0441\u043c\u043e\u0433:<\/p>\n<pre><code class=\"python\">lst = [{'name': 'Bob'}, {'name': 'Alice'}]  lst.sort(itemgetter('name'))  # TypeError: sort() takes no positional arguments lst.sort(key=itemgetter('name'))  # works  sorted(lst, itemgetter('name'))  # TypeError: sorted expected 1 argument, got 2 sorted(lst, key=itemgetter('name'))  # works sorted(iterable=lst, key=itemgetter('name'))  # TypeError: sorted expected 1 argument, got 0  list(map(str.upper, 'abc'))  # works list(map(function=str.upper, iterable='abc'))  # TypeError: map() takes no keyword arguments  open('docker-compose.yml')  # works open(file='docker-compose.yml')  # works <\/code><\/pre>\n<p>\u042f \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u043f\u043e\u0447\u0435\u043c\u0443 \u0433\u0434\u0435-\u0442\u043e \u043c\u043d\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0430 \u0433\u0434\u0435-\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f, \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443. \u041c\u043e\u0436\u043d\u043e, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u044f \u0431\u0443\u0434\u0443 \u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a, \u043a\u0430\u043a \u0441\u0447\u0438\u0442\u0430\u044e \u043d\u0443\u0436\u043d\u044b\u043c?<\/p>\n<h2>\u0421\u0442\u0440\u0430\u043d\u043d\u043e\u0435 legacy<\/h2>\n<h3>Multiprocessing thread pool<\/h3>\n<p>\u041a\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432 \u043f\u043e\u0442\u043e\u043a\u0435 \u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442?<\/p>\n<ol>\n<li>\n<p>\u041d\u0443, \u0435\u0441\u0442\u044c <code>ThreadPoolExecutor<\/code> &#8212; \u043a\u0440\u0430\u0441\u0438\u0432\u043e:<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"python\">from concurrent.futures import ThreadPoolExecutor  fn = lambda: 5 with ThreadPoolExecutor() as pool:     future = pool.submit(fn)     print(future.result()) <\/code><\/pre>\n<ol start=\"2\">\n<li>\n<p>\u041d\u043e \u0442\u0443\u0442 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c: \u044d\u0442\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e! \u0414\u0430\u0432\u0430\u0439, \u043d\u0430\u043f\u0438\u0448\u0438 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e-\u0434\u0436\u0443\u043d\u043e\u0432\u0441\u043a\u0438! \u0412\u043e\u0442, \u043f\u043e\u043b\u0443\u0447\u0430\u0439\u0442\u0435 &#8212; \u043a\u0443\u0447\u0430 \u0431\u043e\u0439\u043b\u0435\u0440\u043f\u043b\u0430\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043a\u043e\u0441\u0442\u044b\u043b\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441 <code>Thread<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c:<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"python\">from threading import Thread  class ThreadWithReturnValue(Thread):     def __init__(self, *args, **kwargs):         super().__init__(*args, **kwargs)         self._return = None       def run(self):         if self._target is not None:             self._return = self._target(*self._args, **self._kwargs)                   def join(self, *args):         super().join(*args)         return self._return           fn = lambda: 5 thread = ThreadWithReturnValue(target=fn) thread.start() result = thread.join() print(result) <\/code><\/pre>\n<ol start=\"3\">\n<li>\n<p>\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0432\u043e\u0442 \u0432\u0430\u043c low-level <code>Thread<\/code>, \u0432\u043e\u0442 \u0432\u0430\u043c high-level <code>ThreadPoolExecutor<\/code> &#8212; \u044e\u0437\u0430\u0439 \u0447\u0442\u043e \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f. \u041d\u043e \u0432\u0434\u0440\u0443\u0433 \u0432\u044b \u0444\u0430\u043d\u0430\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0438 \u0436\u0438\u0442\u044c \u0431\u0435\u0437 \u043d\u0438\u0445 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435? \u0425\u0430, \u043f\u0438\u0442\u043e\u043d \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u043b\u0441\u044f \u043e \u0432\u0430\u0441, \u0432\u0435\u0434\u044c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u043b\u044e\u0431\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f <code>multiprocessing<\/code>:<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"python\">from multiprocessing.pool import ThreadPool  # \u0447\u0435\u0433\u043e \u0431\u043b***?! pool = ThreadPool(processes=2)  # \u043d\u0443 \u0440\u0435\u0430\u043b\u044c\u043d\u043e, \u043f\u0430\u0446\u0430\u043d\u044b, \u044d\u0442\u043e \u0447\u043e?  fn = lambda: 5 async_result_f = pool.apply_async(fn)  # \u043d\u0443 \u0438 async \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u0447\u0451 \u0443\u0436 \u0442\u0430\u043c print(async_result_f.get())  # \u0438 \u0435\u0449\u0451 get(), \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u044d\u0442\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044c :D <\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/0a3\/d95\/304\/0a3d95304bffc2eb676becd04be8ad76.jpg\" alt=\"&quot;\u0421\u0443\u0434\u0430\u0440\u044c, \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043c\u043d\u0435 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c!&quot;\" title=\"&quot;\u0421\u0443\u0434\u0430\u0440\u044c, \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043c\u043d\u0435 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c!&quot;\" width=\"1280\" height=\"720\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0a3\/d95\/304\/0a3d95304bffc2eb676becd04be8ad76.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>&#171;\u0421\u0443\u0434\u0430\u0440\u044c, \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043c\u043d\u0435 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c!&#187;<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0440\u043e\u0434\u0435 \u044d\u0442\u043e \u0442\u0438\u043f\u0430 deprecated, \u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 warnings&#8230;<\/p>\n<h3>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u044f<\/h3>\n<p>\u0423 \u043d\u0430\u0441 \u0442\u0443\u0442 \u043f\u0438\u0442\u043e\u043d! \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u044b \u043f\u0438\u0448\u0435\u043c \u0442\u0430\u043a: <code>class MySuperClass<\/code>. \u0410 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0438\u0448\u0435\u043c \u0442\u0430\u043a: <code>my_super_variable = 1<\/code>.<\/p>\n<p>\u041d\u043e \u0435\u0441\u0442\u044c \u0435\u0449\u0451, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0434\u0443\u043b\u044c logging, \u0435\u043c\u0443 \u0432\u0441\u0451 \u043c\u043e\u0436\u043d\u043e:<\/p>\n<pre><code class=\"python\">import logging  logger = logging.getLogger(__name__)  # \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 get_logger?! logging.basicConfig()  # \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 basic_config? logging.setLevel(level)  # \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 set_level... <\/code><\/pre>\n<p>\u041b\u0430\u0434\u043d\u043e, \u0441 logging \u0432\u0441\u0451 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0440\u0435\u0448\u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0451 \u0432 camelCase, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u044b\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0439. \u0410 \u0432\u043e\u0442 \u0441 <code>csv<\/code> \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438\u0441\u044c:<\/p>\n<pre><code class=\"python\">import csv  reader = csv.DictReader(file)  # \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0431\u0443\u043a\u0432\u044b reader = csv.reader(file)  # \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u0431\u0443\u043a\u0432\u044b, \u043d\u043e \u043d\u0430\u0437\u043e\u0432\u0451\u043c \u0435\u0451 \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441 <\/code><\/pre>\n<p>\u0415\u0449\u0451 \u0440\u0430\u0437, \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435::<\/p>\n<pre><code class=\"python\">get_dialect  # \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0438\u0430\u043b\u0435\u043a\u0442 list_dialects  # \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0438\u0430\u043b\u0435\u043a\u0442\u043e\u0432 reader  # \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0447\u0438\u0442\u0430\u043b\u043a\u0443 csv \u0444\u0430\u0439\u043b\u043e\u0432 \u00af\\_(\u30c4)_\/\u00af <\/code><\/pre>\n<h3>\u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/h3>\n<p>\u041a\u0443\u0440\u0438\u0446\u0430 \u0438\u043b\u0438 \u044f\u0439\u0446\u043e? \u0412 \u0441\u043c\u044b\u0441\u043b\u0435, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u043b\u0438 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f?<\/p>\n<pre><code class=\"python\">map(lambda x: x+1, [1, 2, 3])  # function, collection sorted([1, 2, 3], key=lambda x: x+1)  # collection, function filter(lambda x: x > 0, [0, 1, 2])  # function, collection max([0, 1, 2], key=lambda x: x = 1)  # collection, function <\/code><\/pre>\n<h3>Calendar<\/h3>\n<p>\u042d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c \u0442\u043e\u0447\u043d\u043e \u0431\u044b\u043b \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u0451\u043d php \u0441 \u0435\u0433\u043e <a href=\"https:\/\/www.php.net\/manual\/en\/function.gzgetss.php\" rel=\"noopener noreferrer nofollow\">\u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u043d\u0430 \u0432\u0441\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u0436\u0438\u0437\u043d\u0438<\/a>:<\/p>\n<p>(<a href=\"https:\/\/docs.python.org\/3\/library\/calendar.html\" rel=\"noopener noreferrer nofollow\">https:\/\/docs.python.org\/3\/library\/calendar.html<\/a>)<\/p>\n<pre><code>itermonthdates(year, month)\u00b6 Return an iterator for the month month (1\u201312) in the year year. This iterator will return all days (as datetime.date objects) for the month and all days before the start of the month or after the end of the month that are required to get a complete week.  itermonthdays(year, month) Return an iterator for the month month in the year year similar to itermonthdates(), but not restricted by the datetime.date range. Days returned will simply be day of the month numbers. For the days outside of the specified month, the day number is 0.  itermonthdays2(year, month) Return an iterator for the month month in the year year similar to itermonthdates(), but not restricted by the datetime.date range. Days returned will be tuples consisting of a day of the month number and a week day number.  itermonthdays3(year, month) Return an iterator for the month month in the year year similar to itermonthdates(), but not restricted by the datetime.date range. Days returned will be tuples consisting of a year, a month and a day of the month numbers.  itermonthdays4(year, month) Return an iterator for the month month in the year year similar to itermonthdates(), but not restricted by the datetime.date range. Days returned will be tuples consisting of a year, a month, a day of the month, and a day of the week numbers. <\/code><\/pre>\n<p>\u0416\u0434\u0443 <code>itermonthdays5<\/code>.<\/p>\n<h2>Async<\/h2>\n<p>\u0423 \u043c\u0435\u043d\u044f \u043f\u0440\u044f\u043c \u0433\u043e\u0440\u0438\u0442 \u0441\u0438\u043d\u0438\u043c \u043f\u043b\u0430\u043c\u0435\u043d\u0435\u043c!<\/p>\n<p>\u042f \u043a\u0430\u043a-\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u043b\u0433\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u043b\u0441\u044f \u0431\u0435\u0437 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0438 \u0436\u0438\u043b \u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u043e, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0435\u0433\u043e \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u0431\u043e\u0442\u0430. \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0435 \u0432\u044b\u0432\u043e\u0437\u0438\u0442, \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043d\u0435 \u043d\u0430\u0441\u043e\u0437\u0434\u0430\u0451\u0448\u044c\u0441\u044f \u0432\u0434\u043e\u0432\u043e\u043b\u044c, \u0430 \u0432\u043e\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0449\u0438\u043d\u0430 &#8212; \u0442\u043e, \u0447\u0442\u043e \u0434\u043e\u043a\u0442\u043e\u0440 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043b. \u0418 \u0432\u043e\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u044f \u043f\u0438\u0448\u0443 \u043d\u0430 async, \u0443 \u043c\u0435\u043d\u044f \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b:<\/p>\n<h3>\u042d\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u044f\u0437\u044b\u043a<\/h3>\n<p>\u042d\u0442\u043e \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u0441\u0442\u044c \u043d\u0430 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u044f\u0437\u044b\u043a! \u0412\u0435\u0441\u044c \u043c\u043e\u0439 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u043c\u043e\u0439\u043a\u0443, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u044f \u0431\u0435\u0440\u0443\u0441\u044c \u0437\u0430 async.<\/p>\n<p>\u0412\u043e\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044f \u0440\u0435\u0448\u0438\u043b \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0437\u0430\u043d\u043e\u0432\u043e:<\/p>\n<pre><code class=\"python\">from dataclasses import dataclass import requests  @dataclass class Parser:     def __post_init__(self):         self.session = requests.Session()  # \u0438 \u0432\u0441\u0451!  parser = Parser() <\/code><\/pre>\n<p>\u0410 \u0432\u043e\u0442 \u044f \u043f\u0440\u0438\u0435\u0445\u0430\u043b \u0432 \u044d\u0442\u043e\u0439 \u0438\u0434\u0435\u0435\u0439 \u0430 async:<\/p>\n<pre><code class=\"python\">import aiohttp  @dataclass class Parser:     def __post_init__(self):         self.session = aiohttp.ClientSession()  parser = Parser()  # DeprecationWarning: The object should be created within an async function <\/code><\/pre>\n<p>\u041c\u043e\u0436\u0435\u0442, \u0442\u0430\u043a?<\/p>\n<pre><code class=\"python\">import aiohttp  @dataclass class Parser:     async def __post_init__(self):         self.session = aiohttp.ClientSession()  parser = Parser()  # RuntimeWarning: coroutine 'Parser.__post_init__' was never awaited <\/code><\/pre>\n<p>\u0418\u043b\u0438 \u0442\u0430\u043a?<\/p>\n<pre><code class=\"python\">import aiohttp  @dataclass class Parser:     async def __post_init__(self):         self.session = aiohttp.ClientSession()  parser = await Parser()  # TypeError: object Parser can't be used in 'await' expression <\/code><\/pre>\n<p>\u0410\u0445, \u0434\u0430&#8230; \u041c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b <a href=\"https:\/\/stackoverflow.com\/a\/33134213\/1935381\" rel=\"noopener noreferrer nofollow\">\u043d\u0435 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 async<\/a>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0445\u0440\u0435\u043d \u0432\u0430\u043c, \u0430 \u043d\u0435 \u0432\u0430\u0448\u0430 \u043a\u0440\u0430\u0441\u0438\u0432\u0430\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f. \u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0447\u0442\u043e-\u0442\u043e \u0438\u043d\u0438\u0446\u0438\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 <code>__aenter__<\/code>:<\/p>\n<pre><code class=\"python\">import aiohttp  class Parser:     async def __aenter__(self):         self.session = aiohttp.ClientSession()  async with Parser() as parser:  # AttributeError: __aexit__     ... <\/code><\/pre>\n<p>\u041d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c <code>__aexit__<\/code>:<\/p>\n<pre><code class=\"python\">import aiohttp  class Parser:     async def __aenter__(self):         self.session = aiohttp.ClientSession()         return self      async def __aexit__(self, *args, **kwargs):         pass  async with Parser() as parser:     ... <\/code><\/pre>\n<p>\u0422\u043e\u0442 \u043b\u0438 \u044d\u0442\u043e \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b\u0439 \u043f\u0438\u0442\u043e\u043d, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u043f\u0440\u0438\u0432\u044b\u043a \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0440\u0443\u0442\u044b\u0435 \u0432\u0435\u0449\u0438? \u041f\u043e\u0447\u0435\u043c\u0443 \u043c\u043e\u0438 \u043a\u043b\u0430\u0441\u0441\u044b \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u044e\u0442\u0441\u044f, \u0430 \u043a\u043e\u0434 \u0441\u0434\u0432\u0438\u043d\u0443\u0442 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u043c\u0438 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430\u043c\u0438? \u041f\u043e\u0447\u0435\u043c\u0443 \u044f \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043f\u0440\u043e event loop? \u041f\u043e\u0447\u0435\u043c\u0443 \u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u0440\u043e\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043b\u044e\u0431\u0438\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u0438 \u0443\u0447\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0435? \u0410 \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0438 \u043f\u0438\u0441\u0430\u043b\u043e\u0441\u044c \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434? \u041d\u0443 \u0442\u0430\u043c \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u0432\u043c\u0435\u0441\u0442\u043e<\/p>\n<pre><code class=\"python\">pool = ThreadPoolExecutor() result = await some_fn() async with some_weird_stuff() as stuff:     tasks = []     async for item in stuff.iter_elements():         if not item:             break         tasks += [         loop.create_task(async_process(item))     loop.run_in_executor(pool, sync_process(item)),      ]  results = await asyncio.gather(*tasks) <\/code><\/pre>\n<p>\u044f \u043f\u0438\u0441\u0430\u043b \u0447\u0451-\u043d\u0438\u0442\u044c \u0442\u0438\u043f\u0430<\/p>\n<pre><code class=\"python\">result = some_fn() stuff = some_weird_stuff() tasks = [] for item in stuff.iter_elements():     if not item:         break     tasks.append(         loop.submit(async_process, item),         loop.submit(sync_process, item),     ) results = futures.wait(tasks) <\/code><\/pre>\n<p>\u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0413\u0432\u0438\u0434\u043e \u0438 python core team \u0441\u0430\u043c\u0438 \u0447\u0438\u0442\u0430\u043b\u0438 \u043c\u043e\u0439 \u043a\u043e\u0434, \u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438, \u0447\u0442\u043e \u0442\u0430\u043c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435, \u0430 \u0447\u0442\u043e \u043d\u0435\u0442, \u0438 \u0441\u0430\u043c\u0438 \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0438 \u0432\u0435\u0441\u044c \u044d\u0442\u043e\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u0434?<\/p>\n<p>\u042f \u043c\u043e\u0433\u0443 \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u0441\u0435\u0431\u044f &#171;\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440-\u043c\u0430\u0441\u0442\u0435\u0440\u043e\u043c&#187;, \u043d\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043f\u0438\u0442\u043e\u043d \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043c\u043d\u0435, \u0447\u0442\u043e \u044f \u043d\u0438\u043a\u0442\u043e. \u0412\u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440:<\/p>\n<pre><code class=\"python\">import asyncio  async def generator():     for i in range(10):         yield i         await asyncio.sleep(0.1)  async def main():     async for value in generator():         print(value)  if __name__ == '__main__':     asyncio.run(main()) <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c &#8212; \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 &#8212; \u044f \u0445\u043e\u0447\u0443 \u0434\u0432\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430! \u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043f\u0440\u043e <code>itertools.chain<\/code>:<\/p>\n<pre><code class=\"python\">import asyncio from itertools import chain  async def generator():     for i in range(10):         yield i         await asyncio.sleep(0.1)  async def main():     async for value in chain(generator(), generator()):         print(value)  if __name__ == '__main__':     asyncio.run(main())  <\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/838\/0a4\/e78\/8380a4e7822694c6281e84000a5c3e7f.jpg\" alt=\"\u042d\u0442\u043e \u043f\u0440\u044f\u043c \u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u0438\u0448\u0443 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434\" title=\"\u042d\u0442\u043e \u043f\u0440\u044f\u043c \u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u0438\u0448\u0443 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434\" width=\"698\" height=\"619\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/838\/0a4\/e78\/8380a4e7822694c6281e84000a5c3e7f.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u042d\u0442\u043e \u043f\u0440\u044f\u043c \u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u0438\u0448\u0443 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0443 \u0438 \u0442\u0430\u043a \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e, \u0432\u0441\u0435 \u043c\u043e\u0438 \u0437\u043d\u0430\u043d\u0438\u044f \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b, \u0438 \u043c\u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e \u0438\u0437\u0443\u0447\u0430\u0442\u044c, \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0435 \u0432\u0435\u0449\u0438 \u0432 \u0430\u0441\u0438\u043d\u043a-\u043c\u0438\u0440\u0435.<\/p>\n<p>\u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0449\u0430\u0441 \u043a\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0445 \u043d\u0430\u043f\u0438\u0448\u0435\u0442, \u043f\u043e\u0447\u0435\u043c\u0443 async \u0442\u0430\u043a\u043e\u0439, \u043a\u0430\u043a\u043e\u0439 \u043e\u043d \u0435\u0441\u0442\u044c, \u0438 \u0447\u0442\u043e \u0438\u043d\u0430\u0447\u0435 \u0438 \u0431\u044b\u0442\u044c \u043d\u0435 \u043c\u043e\u0433\u043b\u043e, \u043d\u043e \u044f, \u043a\u0430\u043a \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0441 \u043d\u0435\u0437\u0430\u043c\u044b\u043b\u0435\u043d\u043d\u044b\u043c \u0432\u0437\u0433\u043b\u044f\u0434\u043e\u043c, \u0441\u0435\u0439\u0447\u0430\u0441 \u0433\u043b\u044f\u0436\u0443 \u043d\u0430 \u0432\u0441\u0451 \u044d\u0442\u043e \u0438 \u043e\u0444\u0438\u0433\u0435\u0432\u0430\u044e.<\/p>\n<h3>\u0418 \u0442\u0440\u0435\u0441\u043d\u0443\u043b \u043c\u0438\u0440 \u043d\u0430\u043f\u043e\u043f\u043e\u043b\u0430\u043c<\/h3>\n<p>\u0422\u0443\u0442 \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0437\u0430 \u043c\u0435\u043d\u044f \u0432 <a href=\"https:\/\/habr.com\/ru\/articles\/466337\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u043e \u043a\u0440\u0430\u0441\u043d\u044b\u0435\/\u0441\u0438\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/a> &#8212; \u043e\u043d\u0430 \u043f\u0440\u044f\u043c \u043c\u043e\u0438 \u043c\u044b\u0441\u043b\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442. \u0423 \u043c\u0435\u043d\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u0433\u0434\u0435-\u0442\u043e \u043a\u0440\u0430\u0441\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0433\u0434\u0435-\u0442\u043e \u0441\u0438\u043d\u0438\u0435, \u0441\u0438\u043d\u0438\u0435 \u0432 \u043a\u0440\u0430\u0441\u043d\u044b\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 (\u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u0432\u0441\u0451 \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442), \u043a\u0440\u0430\u0441\u043d\u044b\u0435 \u0432 \u0441\u0438\u043d\u0438\u0445 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442. \u041f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u0438\u043a\u0438\u0435 \u0442\u0440\u0435\u0434\u044b \u043e \u0442\u043e\u043c, <a href=\"https:\/\/github.com\/tiangolo\/typer\/issues\/88\" rel=\"noopener noreferrer nofollow\">\u043a\u0430\u043a \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u0440\u0430\u0441\u043d\u043e\u0435 \u0432 \u0441\u0438\u043d\u0435\u043c<\/a>, \u0434\u0436\u0430\u043d\u0433\u043e \u0432\u0440\u043e\u0434\u0435 <a href=\"https:\/\/docs.djangoproject.com\/en\/4.2\/topics\/async\/\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u043a\u0440\u0430\u0441\u043d\u0435\u043b\u043e<\/a>, \u043d\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u0447\u0430\u0441\u0442\u0438 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0441\u0438\u043d\u0438\u0435, <code>requests<\/code> \u0441\u0438\u043d\u0438\u0435 \u0438 \u043d\u0435 \u043a\u0440\u0430\u0441\u043d\u0435\u044e\u0442, \u0432 IDE \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043a\u0440\u0430\u0441\u043d\u044b\u0435 \u043a\u043b\u043e\u043d\u044b \u0441\u0438\u043d\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435, \u0438 \u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/88f\/771\/f52\/88f771f52cd0dd6a159e4b2d0f4ecc3d.jpg\" alt=\"\u0430\u0441\u043e\u0431\u0440\u0430\u0442\u044c, \u0430\u043c\u0430\u0441\u0441\u043e\u0432\u043e_\u0441\u043e\u0437\u0434\u0430\u0442\u044c, \u0430\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442, \u0430\u0441\u043e\u0437\u0434\u0430\u0442\u044c, \u0430\u043d\u0435_\u043f\u043e\u0435\u0445\u0430\u0442\u044c_\u043b\u0438_\u043c\u043d\u0435_\u0432_\u0434\u0443\u0440\u043a\u0443\" title=\"\u0430\u0441\u043e\u0431\u0440\u0430\u0442\u044c, \u0430\u043c\u0430\u0441\u0441\u043e\u0432\u043e_\u0441\u043e\u0437\u0434\u0430\u0442\u044c, \u0430\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442, \u0430\u0441\u043e\u0437\u0434\u0430\u0442\u044c, \u0430\u043d\u0435_\u043f\u043e\u0435\u0445\u0430\u0442\u044c_\u043b\u0438_\u043c\u043d\u0435_\u0432_\u0434\u0443\u0440\u043a\u0443\" width=\"859\" height=\"334\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/88f\/771\/f52\/88f771f52cd0dd6a159e4b2d0f4ecc3d.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u0430\u0441\u043e\u0431\u0440\u0430\u0442\u044c, \u0430\u043c\u0430\u0441\u0441\u043e\u0432\u043e_\u0441\u043e\u0437\u0434\u0430\u0442\u044c, \u0430\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442, \u0430\u0441\u043e\u0437\u0434\u0430\u0442\u044c, \u0430\u043d\u0435_\u043f\u043e\u0435\u0445\u0430\u0442\u044c_\u043b\u0438_\u043c\u043d\u0435_\u0432_\u0434\u0443\u0440\u043a\u0443<\/figcaption><\/div>\n<\/figure>\n<h3>\u041a\u0430\u043a \u044d\u0442\u043e \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c<\/h3>\n<p>\u041e\u043a\u0430\u0437\u044b\u0432\u0435\u0442\u0441\u044f, \u0443 <code>asyncio<\/code> \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0440\u0435\u0436\u0438\u043c\u0430: product \u0438 debug. \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c async \u043a\u043e\u0434, \u0442\u043e \u0443 \u0432\u0430\u0441 4 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 (\u0427\u0415\u0422\u042b\u0420\u0415) \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c:<\/p>\n<blockquote>\n<p>* Setting the\u00a0<code>PYTHONASYNCIODEBUG<\/code>\u00a0environment variable to\u00a0<code>1<\/code><br \/>* Using the\u00a0<a href=\"https:\/\/docs.python.org\/3\/library\/devmode.html#devmode\" rel=\"noopener noreferrer nofollow\">Python Development Mode<\/a><br \/>* Passing\u00a0<code>debug=True<\/code>\u00a0to\u00a0<code>asyncio.run()<\/code><br \/>* Calling\u00a0<code>loop.set_debug()<\/code><br \/>(<a href=\"https:\/\/docs.python.org\/3\/library\/asyncio-dev.html\" rel=\"noopener noreferrer nofollow\">https:\/\/docs.python.org\/3\/library\/asyncio-dev.html<\/a>)  <\/p>\n<\/blockquote>\n<p>\u041d\u0443 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0449\u0438\u043d\u0443 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0434\u0435\u0441\u044c, \u043f\u043e\u0442\u043e\u043c \u0442\u0430\u043c, \u043f\u043e\u0442\u043e\u043c \u0442\u0443\u0442, \u043f\u043e\u0442\u043e\u043c \u0435\u0449\u0451 \u0433\u0434\u0435-\u0442\u043e. \u0412 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u043f\u0438\u0442\u043e\u043d\u0435 \u0443 \u043c\u0435\u043d\u044f \u043c\u043e\u0436\u0435\u0442, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0431\u044b\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c, \u043d\u043e \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0430\u0432\u043b\u044e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0432 1, \u0438 \u0443 \u043c\u0435\u043d\u044f \u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u0447\u0442\u0438 \u0447\u0442\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434, \u0433\u0434\u0435 \u044f \u0434\u0430\u0436\u0435 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u044e. \u0412 \u0430\u0441\u0438\u043d\u043a\u0435 \u0443 \u043c\u0435\u043d\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e &#171;\u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0438\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0437\u0433\u043b\u044f\u0434\u0430&#187;, \u043a\u043e\u0433\u0434\u0430 \u044f \u0441\u043c\u043e\u0442\u0440\u044e \u043d\u0430 \u043a\u043e\u0434 \u0438 \u043f\u044b\u0442\u0430\u044e\u0441\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0443\u043c\u0435, \u0447\u0442\u043e \u0442\u0430\u043c \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. \u041f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0441\u044f\u043a\u0438\u0435 <a href=\"https:\/\/github.com\/aio-libs\/aiomonitor\" rel=\"noopener noreferrer nofollow\">\u043c\u043e\u043d\u0438\u0442\u043e\u0440\u044b<\/a>, \u0447\u0442\u043e\u0431\u044b \u0445\u043e\u0442\u044c \u043a\u0430\u043a-\u0442\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.<\/p>\n<p>\u0410 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c. \u0412\u043e\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0413\u0432\u0438\u0434\u043e \u0432\u0430\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e <a href=\"https:\/\/github.com\/python\/cpython\/issues\/99933\" rel=\"noopener noreferrer nofollow\">\u0441\u043e\u0440\u044f\u043d<\/a>, \u043d\u043e \u0435\u0441\u043b\u0438 <code>asyncio.as_completed<\/code> \u043f\u0430\u0434\u0430\u0435\u0442 \u043f\u043e \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0443, \u0442\u043e \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0442\u0430\u0441\u043a\u0438 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 <code>asyncio.create_task<\/code> \u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0435 \u0433\u0434\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443, \u0442\u043e \u043f\u0440\u0438\u0434\u0451\u0442 \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430 \u0438 <a href=\"https:\/\/docs.python.org\/3\/library\/asyncio-task.html#asyncio.create_task\" rel=\"noopener noreferrer nofollow\">\u0443\u0431\u044a\u0451\u0442 \u0432\u0430\u0448\u0443 \u0437\u0430\u0434\u0430\u0447\u0443<\/a>, \u043f\u0440\u044f\u043c \u0434\u0430\u0436\u0435 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. Asyncio &#8212; \u044d\u0442\u043e \u0432\u0435\u0441\u0435\u043b\u043e.<\/p>\n<p>\u041b\u0430\u0434\u043d\u043e, \u0432\u0441\u0451. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0431\u0443\u0434\u0435\u043c.<\/p>\n<h2>\u041d\u0435\u0442 &#171;\u043f\u0443\u0441\u0442\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430&#187;<\/h2>\n<p>\u0418\u0437 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u0430\u0445\u0430\u0440\u0430: \u043d\u0435\u0442 \u043f\u0443\u0441\u0442\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0442\u043e\u043a\u0435\u043d, \u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0439 &#171;\u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438 \u043c\u0435\u043d\u044f&#187;:<\/p>\n<pre><code class=\"python\">first_name, middle_name, last_name = '\u0418\u0432\u0430\u043d', None, '\u0418\u0432\u0430\u043d\u044b\u0447' # \u0445\u043e\u0447\u0443 \u0442\u0430\u043a: name = ' '.join([first_name, middle_name or pass, last_name])  # -> '\u0418\u0432\u0430\u043d \u0418\u0432\u0430\u043d\u044b\u0447' # \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u0430\u043a: name = ' '.join([first_name, *([middle_name] if middle_name else []), last_name])  # -> '\u0418\u0432\u0430\u043d \u0418\u0432\u0430\u043d\u044b\u0447' # \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043a \u043d\u0435\u043b\u044c\u0437\u044f: name = ' '.join([first_name, middle_name, last_name])  # -> '\u0418\u0432\u0430\u043d  \u0418\u0432\u0430\u043d\u044b\u0447' - \u0434\u0432\u0430 \u043f\u0440\u043e\u0431\u0435\u043b\u0430  <\/code><\/pre>\n<h2>\u0421\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0430\u0434<\/h2>\n<p>\u0423\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u0435\u0442\u0435\u0439 \u043e\u0442 \u044d\u043a\u0440\u0430\u043d\u0430.<\/p>\n<pre><code class=\"python\">{'a': 1}  # \u044d\u0442\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044c dict(a=1)  # \u044d\u0442\u043e \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 {'a'}  # \u044d\u0442\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e (set) {}  # \u044d\u0442\u043e \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e, \u044d\u0442\u043e \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c set()  # \u0430 \u0432\u043e\u0442 \u044d\u0442\u043e \u043f\u0443\u0441\u0442\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e  1  # \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0438\u0441\u043b\u043e (int) (1)  # \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0438\u0441\u043b\u043e (1, 2)  # \u044d\u0442\u043e \u043a\u043e\u0440\u0442\u0435\u0436 (tuple) 1,  # \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u043a\u043e\u0440\u0442\u0435\u0436 ()  # \u044d\u0442\u043e \u043f\u0443\u0441\u0442\u043e\u0439 \u043a\u043e\u0440\u0442\u0435\u0436 (1+2)  # \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e tuple()  # \u0430 \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u043f\u0443\u0441\u0442\u043e\u0439 \u043a\u043e\u0440\u0442\u0435\u0436  []  # \u044d\u0442\u043e \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a [1]  # \u044d\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u043e\u0434\u043d\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c [1, 2, 3]  # \u044d\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0441 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 [i for i in range(3)]  # \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0441\u043f\u0438\u0441\u043e\u043a \u0441 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 ()  # \u044d\u0442\u043e \u043f\u0443\u0441\u0442\u043e\u0439 \u043a\u043e\u0440\u0442\u0435\u0436 (1)  # \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0438\u0441\u043b\u043e (1, 2, 3)  # \u044d\u0442\u043e (\u0445\u0430-\u0445\u0430) \u043a\u043e\u0440\u0442\u0435\u0436 (i for i in range(3))  # \u044d\u0442\u043e \u043d\u0435 \u043a\u043e\u0440\u0442\u0435\u0436, \u044d\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 :D <\/code><\/pre>\n<h2>\u0415\u0441\u043b\u0438 \u043d\u0435\u043b\u044c\u0437\u044f, \u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f<\/h2>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f:<\/p>\n<pre><code class=\"python\">foo(a=1, b.c=2, whatever-you-f***ing-want=3)` <\/code><\/pre>\n<p>\u041d\u043e \u0435\u0441\u043b\u0438 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u0442\u043e \u043c\u043e\u0436\u043d\u043e:<\/p>\n<pre><code class=\"python\">foo(**{'a': 1, 'b.c': 2, 'whatever-you-f***ing-want': 3}) <\/code><\/pre>\n<h2>\u0414\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u044b<\/h2>\n<h3>@cached_method<\/h3>\n<p>\u0415\u0441\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c:<\/p>\n<pre><code class=\"python\">def super_expensive_function(a: int, b: int) -> int: print('calculation...')     return a ** b  @dataclass class Object:     value: int      def method(self, b: int) -> int:         return super_expensive_function(self.value, b)      @property     def prop(self) -> int:         return super_expensive_function(self.value, 2)  obj = Object(value=5) obj.method(2)  # calculation...25 obj.method(2)  # calculation...25 obj.prop  # calculation...25 obj.prop  # calculation...25 <\/code><\/pre>\n<p>\u041c\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0441\u0447\u0438\u0442\u0430\u0442\u044c <code>super_expensive_function<\/code> \u0437\u0430\u043d\u043e\u0432\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0445\u043e\u0442\u0438\u043c \u044d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0414\u0430, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043d\u043e \u043d\u0430\u043c \u0431\u044b \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u043a\u044d\u0448 \u0445\u0440\u0430\u043d\u0438\u043b\u0441\u044f \u0441 \u0441\u0430\u043c\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u0438 \u0443\u0434\u0430\u043b\u044f\u043b\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043d\u0438\u043c\u0438.<\/p>\n<p>\u041e\u043a\u0435\u0439, \u0435\u0441\u0442\u044c <code>@cached_property<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 &#171;\u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442&#187; \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430:<\/p>\n<pre><code class=\"python\">from functools import cached_property  @dataclass class Object:     # ...      @cached_property     def prop(self) -> int:         return super_expensive_function(self.value, 2)  obj.prop  # calculation...25 obj.prop  # 25 <\/code><\/pre>\n<p>\u0410 \u0432\u043e\u0442 \u0434\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u0430 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e <code>@cached_method<\/code> \u043d\u0435\u0442 &#8212; \u0431\u0443\u0434\u044c\u0442\u0435 \u0434\u043e\u0431\u0440\u044b \u0437\u0430\u043f\u0438\u043b\u0438\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435! <code>@cache<\/code> \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 \u043a\u044d\u0448 \u0434\u0430\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<h3>@classmethod<\/h3>\n<p>\u041a\u043b\u0430\u0441\u0441\u043c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0443\u0436\u0434\u043e\u0435, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u043a\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u043d\u0435\u043b\u044c\u0437\u044f!<\/p>\n<pre><code class=\"python\"># NO: @my_decorator @classmethod def method(cls, ...):  # YES: @classmethod @my_decorator def method(cls, ...): <\/code><\/pre>\n<h2>\u0418\u043d\u0434\u0435\u043a\u0441\u044b<\/h2>\n<p><code>range<\/code> \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043a\u0430\u043a <code>[\u043d\u0430\u0447\u0430\u043b\u043e, \u043a\u043e\u043d\u0435\u0446)<\/code>:<\/p>\n<ul>\n<li>\n<p><code>range(0, 3)<\/code> &#8212; \u044d\u0442\u043e <code>[0, 1, 2]<\/code>, \u0438 \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0447\u0438\u0441\u043b\u0430 \u043e\u0442 <code>1<\/code> \u0434\u043e <code>10<\/code>, \u0442\u043e \u0432\u044b\u043f\u0438\u0448\u0435\u0442\u0435 <code>range(1, 11)<\/code><\/p>\n<\/li>\n<li>\n<p>\u041f\u043e \u044d\u0442\u043e\u0439 \u0436\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441 <code>10<\/code> \u0434\u043e <code>1<\/code> \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0442\u043e \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 <code>range(10, 0, -1)<\/code> \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 (\u0447\u0442\u043e \u0432 \u043f\u0438\u0442\u043e\u043d\u0435, \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u043d\u0435\u0447\u0430\u0441\u0442\u043e), \u0442\u043e \u0432\u0435\u0437\u0434\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f <code>i+1<\/code> \u0438\u043b\u0438 <code>i-1<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430\u0447\u0430\u043b\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f,\u0430 \u043a\u043e\u043d\u0435\u0446 &#8212; \u043d\u0435\u0442. \u042d\u0442\u043e \u0431\u0435\u0441\u0438\u0442.<\/p>\n<\/li>\n<\/ul>\n<h2>Open<\/h2>\n<p><code>open<\/code> \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0444\u0430\u0439\u043b\u044b \u043d\u0435 \u0432 <code>utf8<\/code>, \u043a\u0430\u043a \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0434\u0443\u043c\u0430\u0442\u044c, \u0430 \u0432 <em>\u043a\u0430\u043a\u043e\u0439-\u0442\u043e<\/em> \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 &#8212; <a href=\"https:\/\/stackoverflow.com\/a\/36316351\/1935381\" rel=\"noopener noreferrer nofollow\">\u0432\u044b\u0431\u043e\u0440 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0441\u0440\u0435\u0434\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<\/a>. \u0412 windows \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, <code>Windows-1252<\/code>. \u041f\u0440\u0438\u0437\u043d\u0430\u044e\u0441\u044c, \u043f\u043e\u043f\u0430\u0434\u0430\u043b\u0441\u044f \u043d\u0430 \u044d\u0442\u043e \u043f\u0430\u0440\u0443 \u0440\u0430\u0437. \u0412\u043e\u043e\u0431\u0449\u0435 \u043e\u0431\u043e\u0436\u0430\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u044d\u0442\u043e \u0442\u0430\u043a \u0437\u0430\u0433\u0430\u0434\u043e\u0447\u043d\u043e.<\/p>\n<h2>NotImplemented \u0438 len<\/h2>\n<ul>\n<li>\n<p>\u0415\u0441\u0442\u044c <code>NotImplemented<\/code> &#8212; \u0432\u0440\u043e\u0434\u0435 \u043a\u0430\u043a \u043d\u0443\u0436\u043d\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u0442 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0443 \u043d\u0435\u0451 \u043f\u0440\u043e\u0441\u044f\u0442.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u0442\u044c <code>NotImplementedError<\/code>  &#8212; \u0432\u0440\u043e\u0434\u0435 \u043a\u0430\u043a \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435\u0442 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0443 \u043d\u0435\u0451 \u043f\u0440\u043e\u0441\u044f\u0442.<\/p>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/stackoverflow.com\/questions\/878943\/why-return-notimplemented-instead-of-raising-notimplementederror\" rel=\"noopener noreferrer nofollow\">\u0412\u043e\u0442 \u0442\u0443\u0442 \u043b\u044e\u0434\u0438 \u043f\u0438\u0448\u0443\u0442 \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u0438\u044f<\/a>, \u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u043d\u0430\u0434\u043e, \u0430 \u044f \u043c\u043e\u043b\u0447\u0443. \u042d\u0442\u043e \u043f\u0438\u0442\u043e\u043d, \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043d\u043e \u0442\u0430\u043a, \u043a\u0430\u043a \u0435\u0441\u0442\u044c. \u0421\u043c\u0438\u0440\u0438\u0441\u044c.<\/p>\n<ul>\n<li>\n<p>\u0415\u0441\u0442\u044c <code>'my string'.split()<\/code> &#8212; \u0432\u0440\u043e\u0434\u0435 \u043a\u0430\u043a \u0443 \u0441\u0442\u0440\u043e\u043a\u0438 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 &#171;\u0440\u0430\u0437\u0431\u0435\u0439 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a&#187;, \u0438 \u044d\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u0442\u044c <code>len('my string')<\/code> &#8212; \u0432\u0440\u043e\u0434\u0435 \u043a\u0430\u043a \u0435\u0441\u0442\u044c <em>\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f<\/em>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u0435\u0440\u043d\u0451\u0442 \u0434\u043b\u0438\u043d\u0443 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/stackoverflow.com\/questions\/237128\/why-does-python-code-use-len-function-instead-of-a-length-method\" rel=\"noopener noreferrer nofollow\">\u0412\u043e\u0442 \u0442\u0443\u0442 \u043b\u044e\u0434\u0438 \u043f\u0438\u0448\u0443\u0442 \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u0438\u044f<\/a>, \u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u043d\u0430\u0434\u043e, \u0430 \u044f \u043c\u043e\u043b\u0447\u0443. \u042d\u0442\u043e \u043f\u0438\u0442\u043e\u043d, \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043d\u043e \u0442\u0430\u043a, \u043a\u0430\u043a \u0435\u0441\u0442\u044c. \u0421\u043c\u0438\u0440\u0438\u0441\u044c.<\/p>\n<h2>map \u0438 filter<\/h2>\n<p>\u0412 \u043f\u0438\u0442\u043e\u043d\u0435 \u0435\u0441\u0442\u044c <code>map()<\/code> \u0438 <code>filter()<\/code>:<\/p>\n<pre><code class=\"python\">filtered = filter(lambda x: x>2, [1, 2, 3]) multiplied = map(lambda x: x*2, [1, 2, 3])  filtered_and_multiplied = map(lambda x: x*2, filter(lambda x: x>2, [1, 2, 3])) multiplied_and_filtered = filter(lambda x: x>2, map(lambda x: x*2, [1, 2, 3])) <\/code><\/pre>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432 \u043f\u0438\u0442\u043e\u043d\u0435 \u0436\u0435 \u0435\u0441\u0442\u044c &#171;comprehensions&#187;, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043b\u0443\u0447\u0448\u0435 \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f:<\/p>\n<pre><code class=\"python\">filtered = (x for x in [1, 2, 3] if x>2) multiplied = (x*2 for x in [1, 2, 3])  filtered_and_multiplied = (x*2 for x in [1, 2, 3] if x>2) multiplied_and_filtered = (y for x in [1, 2, 3] if (y := x*2) > 2) <\/code><\/pre>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043a\u0442\u043e-\u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c <code>map<\/code> \u0438 <code>filter<\/code> \u0432 \u043e\u0434\u043d\u043e\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0438, \u0433\u0434\u0435-\u0442\u043e \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u043a\u043e\u043d\u0446\u0435 \u0441\u0432\u0435\u0442\u0430 \u0443 kesn\u0430 \u0443\u043c\u0438\u0440\u0430\u0435\u0442 \u043d\u0435\u0440\u0432\u043d\u0430\u044f \u043a\u043b\u0435\u0442\u043a\u0430. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043d\u0435 \u043d\u0430\u0434\u043e \u0442\u0430\u043a.<\/p>\n<h2>\u041d\u0435\u0443\u0434\u043e\u0431\u043d\u043e &#171;\u0441\u0446\u0435\u043f\u043b\u044f\u0442\u044c&#187; \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/h2>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b &#8212; \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u044b\u0441\u044f\u0447\u0438 \u0441\u043b\u043e\u0432.<\/p>\n<p>nim-style:<\/p>\n<pre><code>items.sorted(key=...).groupby(key=...) <\/code><\/pre>\n<p>python-style:<\/p>\n<pre><code class=\"python\">groupby(sorted(items, key=...), key=...) <\/code><\/pre>\n<p>nim-style:<\/p>\n<pre><code>items.filter(lambda x: x>2).map(lambda x: x*2)<\/code><\/pre>\n<p>python-style:<\/p>\n<pre><code class=\"python\">map(lambda x: x*2, filter(lambda x: x>2, items))<\/code><\/pre>\n<h2>Starmap<\/h2>\n<p>\u041f\u0443\u0441\u0442\u044c \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u043e\u0447\u043a\u0438:<\/p>\n<pre><code class=\"python\">pairs = [     (1, 2),     (3, 6),     (5, 6),     ... ] <\/code><\/pre>\n<p>\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430:<\/p>\n<pre><code class=\"python\">def is_subsequent(a: int, b: int) -> bool: return abs(a-b) == 1 <\/code><\/pre>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c <code>starmap<\/code>:<\/p>\n<pre><code class=\"python\">from itertools import starmap results = starmap(is_subsequent, pairs) <\/code><\/pre>\n<p>&#8230; \u043d\u043e \u043d\u0435\u0442 <code>ThreadPoolExecutor.starmap<\/code>:<\/p>\n<pre><code class=\"python\">from concurrent.futures import ThreadPoolExecutor pool = ThreadPoolExecutor() # results = pool.starmap(is_subsequent, pairs)  &lt;-- fuck you kesn! 'ThreadPoolExecutor' object has no attribute 'starmap' results = pool.map(lambda pair: is_subsequent(*pair), pairs) <\/code><\/pre>\n<h2>\u041d\u0435\u0442 break(2)<\/h2>\n<p>\u0420\u0435\u0430\u043b\u044c\u043d\u043e, \u0432\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0437\u044f\u0442\u044c \u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 <code>for<\/code>:<\/p>\n<pre><code class=\"python\"># ... some code here  for item in items:     # ... more code here     for element in item.elements:     # ... more code here         if is_ok: break(2)  # ... some code there <\/code><\/pre>\n<p>\u0422\u0430\u043a\u043e\u0435 \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c \u043e\u0431\u0445\u043e\u0434\u043d\u044b\u0435 \u043f\u0443\u0442\u0438 &#8212; \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b\u043d\u043e\u0441\u0438\u0442\u044c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0433\u0434\u0435 \u0432\u043c\u0435\u0441\u0442\u043e <code>break(2)<\/code> \u0434\u0435\u043b\u0430\u0442\u044c <code>return<\/code>. \u0415\u0449\u0451 \u043e\u0434\u043d\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u0432\u0435\u0449\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0434\u0431\u0435\u0448\u0438\u0432\u0430\u0435\u0442.<\/p>\n<h2>\u041d\u0435\u0442 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439<\/h2>\n<p>\u041a\u0430\u043a\u0438\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f? \u0414\u0430 \u043b\u044e\u0431\u044b\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0434 \u0442\u0438\u043f\u0430 \u0442\u0430\u043a\u043e\u0433\u043e:<\/p>\n<pre><code class=\"python\">try: incoming_object = yaml.safe_load(body.decode()) request_data = PostFlopRequestData.parse_obj(incoming_object) except Exception as exc: # \u043b\u043e\u0432\u0438\u043c \u0432\u0441\u0451, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0445\u0440\u0435\u043d \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u044b\u0431\u0440\u043e\u0441\u0438\u0442\u0441\u044f <\/code><\/pre>\n<p>\u0412 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0440\u043e\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445, \u043d\u0430\u0432\u0435\u0440\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0442\u0443\u043b\u0437\u043e\u0439 \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u043c \u0432\u0441\u0435\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u043a\u0443\u0434\u0430 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0439\u0442\u0438, \u043d\u043e \u0432 \u043f\u0438\u0442\u043e\u043d\u0435 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438 \u043a\u043e\u0433\u0434\u0430 \u0443\u0433\u043e\u0434\u043d\u043e. \u041c\u043e\u0436\u0435\u0442, \u0442\u043e\u0433\u0434\u0430 \u0430\u043d\u043d\u043e\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438?<\/p>\n<pre><code class=\"python\">def fn(a: int) -> int, ValueError | ZeroDivizionError:     # ... <\/code><\/pre>\n<p>\u0413\u043b\u0443\u043f\u043e\u0441\u0442\u0438 \u043a\u0430\u043a\u0438\u0435. \u042d\u0442\u043e \u043d\u0438\u043a\u043e\u043c\u0443 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043b\u0443\u0447\u0448\u0435 \u0432\u0432\u0435\u0434\u0451\u043c \u043a\u0430\u043a\u0438\u0435-\u043d\u0438\u0431\u0443\u0434\u044c <code>ParamSpec<\/code>, \u0447\u0442\u043e\u0431 \u0436\u0438\u043b\u043e\u0441\u044c \u0432\u0435\u0441\u0435\u043b\u0435\u0435:<\/p>\n<pre><code class=\"python\">F_Spec = ParamSpec(\"F_Spec\") F_Return = TypeVar(\"F_Return\")  def decorator(     call: Callable[         F_Spec,  # \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438         F_Return     ] ) -> Callable[     F_Spec,      # \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441 \u0442\u0435\u043c\u0438 \u0436\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438     F_Return ]:     @wraps(func)     def wrapper(         *args: F_Spec.args,      # \u044d\u0442\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b         **kwargs: F_Spec.kwargs  # \u044d\u0442\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b     ) -> F_Return:         return call(*args, **kwargs):     return wrapper <\/code><\/pre>\n<p>(\u043a\u0441\u0442\u0430\u0442\u0438, \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 &#8212; \u0438\u0437 <a href=\"https:\/\/habr.com\/ru\/articles\/750312\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u043e \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u044b<\/a>, \u043e\u043d\u0430 \u043a\u043b\u0430\u0441\u0441\u043d\u0430\u044f)<\/p>\n<h2>\u0414\u0430 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u044e\u0442<\/h2>\n<p>\u0411\u0435\u0437\u0434\u0443\u043c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u043d\u0435 \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u043d\u0430 \u043d\u0430\u0448\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0438\u0442\u043e\u043d\u0438\u0441\u0442 \u0445\u043e\u0442\u044c \u0440\u0430\u0437 \u0432 \u0441\u0432\u043e\u0435\u0439 \u0436\u0438\u0437\u043d\u0438 \u043f\u0438\u0441\u0430\u043b \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0441\u0442\u044b\u043b\u044c:<\/p>\n<pre><code class=\"python\">def spend_coins(cls, client: Client, uid: str, num_coins: int):     assert isinstance(num_coins, int), \"\u0410 \u0432\u043e\u0442 \u0438 \u043d\u0435\u0442!\" <\/code><\/pre>\n<p>\u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b <code>num_coins: int<\/code>, \u043d\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0442\u0443\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e, \u0445\u0435-\u0445\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043b\u043e\u0432\u0438\u0442\u044c \u043d\u0430\u0440\u0443\u0448\u0438\u0442\u0435\u043b\u0435\u0439 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 assert. \u041a\u0441\u0442\u0430\u0442\u0438, assert \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u0436\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c python \u0441 \u0444\u043b\u0430\u0433\u043e\u043c <code>-O<\/code>&#8230;<\/p>\n<h2>\u0413\u0432\u0438\u0434\u043e<\/h2>\n<p>\u0427\u0435\u0433\u043e \u0443\u0436 \u043c\u0435\u043b\u043e\u0447\u0438\u0442\u044c\u0441\u044f, \u0441\u0430\u043c \u0413\u0432\u0438\u0434\u043e \u0412\u0430\u043d \u0420\u043e\u0441\u0441\u0443\u043c (Guido Van Rossum) &#8212; \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044c \u044f\u0437\u044b\u043a\u0430 \u043f\u0438\u0442\u043e\u043d &#8212; \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0437\u0430\u0431\u0430\u0433\u043e\u0432\u0430\u043d\u043d\u044b\u0439. \u0412\u0435\u0434\u044c \u043f\u0438\u0448\u0435\u0442\u0441\u044f &#171;\u0413\u0432\u0438\u0434\u043e&#187;, \u0430 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f &#8212; &#171;\u0425\u0438\u0434\u043e&#187;. \u0416\u0438\u0432\u0438\u0442\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u0441 \u044d\u0442\u0438\u043c \ud83d\ude00<\/p>\n<hr\/>\n<p>\u0412 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a\u0435 \u0443 \u043c\u0435\u043d\u044f \u0435\u0449\u0451 \u043c\u043d\u043e\u0433\u043e \u0432\u0441\u044f\u043a\u0438\u0445 \u043d\u0435\u043b\u0435\u043f\u043e\u0441\u0442\u0435\u0439 \u043f\u0440\u043e \u043f\u0438\u0442\u043e\u043d, \u043d\u043e \u044f \u043f\u043e\u0436\u0430\u043b\u0435\u043b \u0441\u0435\u0431\u044f \u0438 \u0432\u0430\u0441. \u0414\u0430 \u0438 \u043a \u0447\u0435\u043c\u0443 \u044d\u0442\u043e? \u0412\u0435\u0434\u044c, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0438 \u043d\u0430 \u0447\u0442\u043e, \u044f \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u044e \u043f\u0438\u0442\u043e\u043d \u043e\u0447\u0435\u043d\u044c \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b\u043c \u0438 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c &#8212; \u0438 \u043a\u0430\u043a \u0440\u0430\u0437 \u043e\u0431 \u044d\u0442\u043e\u043c \u044f \u0438 \u0445\u043e\u0442\u0435\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439. <a href=\"https:\/\/t.me\/blog_pogromista\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u044b\u0433\u0430\u0439\u0442\u0435 \u0432 \u0442\u0435\u043b\u0435\u0433\u0443<\/a>, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c, \u0430 \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043c\u043e\u0438 \u0433\u0438\u0435\u043d\u0438\u0441\u0442\u044b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 &#8212; \u0442\u043e \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 <a href=\"https:\/\/pogrom.dev\" rel=\"noopener noreferrer nofollow\">\u0431\u043b\u043e\u0433 \u041f\u043e\u0433\u0440\u043e\u043c\u0438\u0441\u0442\u0430<\/a>!<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><\/p>\n<div class=\"tm-article-poll-container\"><!--[--><\/p>\n<div class=\"tm-article-poll tm-article-poll_variant-bordered\">\n<div class=\"tm-notice tm-notice_positive tm-article-poll__notice\"><!----><\/p>\n<div class=\"tm-notice__inner\"><!----><\/p>\n<div class=\"tm-notice__content\" data-test-id=\"notice-content\"><!--[--><span>\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u043f\u0440\u043e\u0441\u0435. <a rel=\"nofollow\" href=\"\/kek\/v1\/auth\/habrahabr\/?back=\/ru\/articles\/753672\/&#038;hl=ru\">\u0412\u043e\u0439\u0434\u0438\u0442\u0435<\/a>, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.<\/span><!--]--><\/div>\n<\/div>\n<\/div>\n<p><!--[--><\/p>\n<div class=\"tm-article-poll__header\">\u041f\u043e\u0447\u0435\u043c\u0443 \u044f \u043a\u043b\u0435\u0432\u0435\u0449\u0443 \u043d\u0430 \u043f\u0438\u0442\u043e\u043d \u0432 2:36 \u043d\u043e\u0447\u0438?<\/div>\n<div class=\"tm-article-poll__answers\"><!--[--><\/p>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">38.32% <\/span><span class=\"tm-article-poll__answer-label\">\u041c\u044b \u0432\u0441\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0435 \u043d\u043e\u0447\u044c\u044e<\/span><span class=\"tm-article-poll__answer-votes\">282<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 38.32%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">25.54% <\/span><span class=\"tm-article-poll__answer-label\">\u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u044b \u0445\u043e\u0447\u0435\u0448\u044c \u0434\u0435\u0448\u0451\u0432\u043e\u0439 \u0441\u043b\u0430\u0432\u044b \u0438 \u0445\u0430\u0439\u043f\u0430<\/span><span class=\"tm-article-poll__answer-votes\">188<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 25.54%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">17.53% <\/span><span class=\"tm-article-poll__answer-label\">\u041f\u0443\u0441\u0442\u043e\u0435 \u0432\u0435\u0434\u0440\u043e \u0433\u0440\u0435\u043c\u0438\u0442 \u0433\u0440\u043e\u043c\u0447\u0435<\/span><span class=\"tm-article-poll__answer-votes\">129<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 17.53%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent tm-article-poll__answer-percent_winning\">66.71% <\/span><span class=\"tm-article-poll__answer-label\">\u041f\u0438\u0448\u0438 \u0435\u0449\u0451, \u0448\u0430\u043a\u0430\u043b!<\/span><span class=\"tm-article-poll__answer-votes\">491<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress tm-article-poll__answer-progress_winning\" style=\"width: 66.71%\"><\/div>\n<\/div>\n<\/div>\n<p><!--]--><\/div>\n<div class=\"tm-article-poll__stats\"> \u041f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043b\u0438 736 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.   \u0412\u043e\u0437\u0434\u0435\u0440\u0436\u0430\u043b\u0438\u0441\u044c 105 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. <\/div>\n<p><!--]--><\/div>\n<p><!--]--><\/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\/753672\/\"> https:\/\/habr.com\/ru\/articles\/753672\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<p>\u0412\u0430\u0441 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0430\u0448 \u0437\u0430\u043d\u0443\u0434\u0430!<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u043b\u0435\u0434\u0438\u0442\u0435 \u0437\u0430 \u043c\u043e\u0435\u0439 \u043b\u0435\u043d\u0438\u0432\u043e\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e, \u0442\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438 \u0431\u044b, \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u043c\u043d\u043e\u0433\u043e \u043e\u0442 \u0447\u0435\u0433\u043e \u043f\u0440\u0438\u0433\u043e\u0440\u0430\u0435\u0442. \u0412\u043e\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<ul>\n<li>\n<p>\u0423 \u043c\u0435\u043d\u044f \u043f\u0440\u0438\u0433\u043e\u0440\u0430\u0435\u0442 \u043e\u0442 \u043d\u0438\u0437\u043a\u043e\u0441\u043e\u0440\u0442\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u043f\u043e\u0442\u043e\u043a\u0435: <a href=\"https:\/\/habr.com\/ru\/post\/647515\/\" rel=\"noopener noreferrer nofollow\">\u041f\u0438\u0442\u043e\u043d \u043f\u0440\u043e\u0442\u0438\u0432 \u0411\u0435\u0437\u0443\u043c\u043d\u043e\u0433\u043e \u041c\u0430\u043a\u0441\u0430, \u0438\u043b\u0438 \u043a\u0430\u043a \u044f \u043f\u043e\u0441\u0442\u044b \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0437\u0430\u043c\u043e\u0440\u0430\u0436\u0438\u0432\u0430\u043b<\/a><\/p>\n<\/li>\n<li>\n<p>\u0423 \u043c\u0435\u043d\u044f \u043f\u0440\u0438\u0433\u043e\u0440\u0430\u0435\u0442 \u043e\u0442 Django: <a href=\"https:\/\/habr.com\/ru\/post\/594601\/\" rel=\"noopener noreferrer nofollow\">\u041e\u043a\u0435\u0439, \u0414\u0436\u0430\u043d\u0433\u043e, \u0443 \u043c\u0435\u043d\u044f \u043a \u0442\u0435\u0431\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432<\/a><\/p>\n<\/li>\n<li>\n<p>\u0418 \u043e\u0442 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 \u0442\u043e\u0436\u0435: <a href=\"https:\/\/habr.com\/ru\/post\/550088\/\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u042f\u043d\u0434\u0435\u043a\u0441: \u0442\u0435\u0430\u0442\u0440 \u0430\u0431\u0441\u0443\u0440\u0434\u0430 :\/<\/a><\/p>\n<\/li>\n<li>\n<p>\u0418 \u043e\u0442 \u0440\u0435\u043a\u0440\u0443\u0442\u0435\u0440\u043e\u0432: <a href=\"https:\/\/habr.com\/ru\/post\/534902\/\" rel=\"noopener noreferrer nofollow\">\u042f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u0437 1400, \u0438\u043b\u0438 \u0441\u0430\u043c\u044b\u0439 \u043a\u0440\u0443\u0442\u043e\u0439 \u0440\u0435\u043a\u0440\u0443\u0442\u0438\u043d\u0433, \u0447\u0442\u043e \u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0448\u044c \u0442\u0430\u043a &#8212; \u044f \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0441\u0433\u043e\u0440\u0435\u0442\u044c. \u041d\u043e \u044f, \u0430\u043a\u0438 \u0444\u0435\u043d\u0438\u043a\u0441, \u0432\u043e\u0437\u0440\u043e\u0436\u0434\u0430\u044e\u0441\u044c, \u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0443 \u043c\u0435\u043d\u044f \u0433\u043e\u0440\u0438\u0442 \u043e\u0442, \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e, \u041f\u0438\u0442\u043e\u043d\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u043f\u0438\u0448\u0443 \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0435\u0441\u044f\u0442\u0438 \u043b\u0435\u0442. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u0436\u0435, \u043f\u043e \u043c\u043e\u0435\u043c\u0443 \u043c\u043d\u0435\u043d\u0438\u044e, \u0441 \u043d\u0438\u043c \u043d\u0435 \u0442\u0430\u043a &#8212; \u0442\u043e \u043f\u0440\u043e\u0448\u0443 \u043f\u043e\u0434 \u043a\u0430\u0442.<\/p>\n<h2>GIL \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c<\/h2>\n<p>\u0410 \u0432\u043e\u0442 \u0438 \u043d\u0435\u0442! \u0417\u0434\u0435\u0441\u044c \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u043e GIL \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u0428\u0430\u0445 \u0438 \u043c\u0430\u0442, \u0445\u0435\u0439\u0442\u0435\u0440\u044b \u043f\u0438\u0442\u043e\u043d\u0430 ? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e &#8212; \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u043e &#8212; \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u044d\u0442\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 <s>\u0438 \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0432\u0438\u043d\u0443 \u043d\u0430 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u0438\u0442\u043e\u043d<\/s>. \u0423 \u043c\u0435\u043d\u044f \u0443\u0436\u0435 \u043b\u0435\u0442 5 \u043f\u043e\u0434 \u0431\u043e\u043a\u043e\u043c \u043b\u0435\u0436\u0438\u0442 nim, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u043c\u043e\u0433\u0443 \u0437\u0430 \u043c\u0438\u043d\u0443\u0442\u044b \u043d\u0430\u043a\u0438\u0434\u0430\u0442\u044c \u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u0443\u043f\u0435\u0440-\u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u043f\u043e-\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0439 \u043a\u043e\u0434. \u0418 \u044f \u0434\u0430\u0436\u0435 \u043c\u043e\u0433\u0443 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0438\u0437 \u043f\u0438\u0442\u043e\u043d\u0430 \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442. \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u044f \u044d\u0442\u0438\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f? \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, 0. \u0422\u0430\u043a\u043e\u0435 \u0432\u043e\u0442 \u0441\u0443\u0433\u0443\u0431\u043e \u043b\u0438\u0447\u043d\u043e\u0435 \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u0438\u0435 \u043f\u0438\u0442\u043e\u043d\u0430. \u041d\u0443 \u0438 nogil \u043a\u043e\u0433\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c <a href=\"https:\/\/discuss.python.org\/t\/a-steering-council-notice-about-pep-703-making-the-global-interpreter-lock-optional-in-cpython\/30474\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0438\u043b\u0435\u0442\u0438\u0442 \u0432 \u043d\u0430\u0448\u0435 \u0446\u0430\u0440\u0441\u0442\u0432\u043e<\/a>. \u041d\u043e \u043c\u044b \u0436\u0435 \u0441\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0435 \u0437\u0430 \u044d\u0442\u0438\u043c, \u0434\u0430?<\/p>\n<h2>\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b<\/h2>\n<figure class=\"full-width\">\n<div><figcaption>\u041d\u0443 \u043f\u043e\u0447\u0442\u0438 \u0442\u0430\u043a\u0438\u0435, \u0434\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0442\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0432 \u043f\u0438\u0442\u043e\u043d\u0435, \u0442\u043e\u0442 \u0435\u0449\u0451 \u044e\u043d\u0435\u0446!  \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0431\u044b\u043b\u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043a\u043e\u0431\u043a\u0438 \u0432 \u0432\u044b\u0437\u043e\u0432\u0430\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<pre><code class=\"python\"># \u041a\u0440\u0430\u0441\u0438\u0432\u043e? \u041a\u0440\u0430\u0441\u0438\u0432\u043e! sorted(element.value for element in elements)  # ... \u0445\u043e\u0442\u044f \u0441\u0442\u043e\u0438\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, \u0438 \u0441\u043a\u043e\u0431\u043a\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438. \u041a\u0430\u043a\u043e\u0433\u043e \u0445\u0440\u0435\u043d\u0430?! sorted((element.value for element in elemens), key=attrgetter('attr'))<\/code><\/pre>\n<p>\u0410, \u0447\u0443\u0442\u044c \u043d\u0435 \u0437\u0430\u0431\u044b\u043b &#8212; \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0435\u0449\u0451 \u044d\u043a\u043e\u043d\u043e\u043c\u044f\u0442 \u043f\u0430\u043c\u044f\u0442\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435 \u0432\u044b\u0432\u0430\u043b\u0438\u0432\u0430\u044e\u0442 \u0432\u0441\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0430 \u043b\u0435\u0442\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043d\u0435 \u0432\u0441\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0438\u0437 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e&#8230;<\/p>\n<h3>\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043e\u0442\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430<\/h3>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u043d\u0430\u0442\u044c, \u0433\u0434\u0435 \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d &#8212; \u0442\u0430 \u0435\u0449\u0451 \u0437\u0430\u0434\u0430\u0447\u0430. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 <a href=\"https:\/\/habr.com\/ru\/company\/timeweb\/blog\/723600\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>:<\/p>\n<pre><code class=\"python\">try: quota_chunks = quota_cache.apply(quota_chunks) except InconsistentQuotaCache: log.error('Something went wrong') raise  # \u0410 InconsistentQuotaCache \u0432\u044b\u043a\u0438\u043d\u0443\u043b\u043e\u0441\u044c \u043d\u0430 \u0432\u043e\u0442 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435! \u0425\u0430-\u0445\u0430! first_quota_chunks, quota_chunks = spy(quota_chunks, 1)<\/code><\/pre>\n<h3>\u041e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430<\/h3>\n<p>\u0412 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0443 \u043c\u0435\u043d\u044f \u0431\u044b\u043b\u043e \u0434\u0432\u0430 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0438\u0445 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u043b\u0438\u0442\u044c \u0432 \u043e\u0434\u0438\u043d \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e \u043d\u043e\u043c\u0435\u0440\u043e\u0432. \u0422\u0438\u043f\u0430 <code>a1, a2, a5, a6, ...<\/code> + <code>b2, b4, b5, b8, ...<\/code> -> <code>a1, a2, b2, b4, a5, b5, a6, b8, ...<\/code>. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 <code>A<\/code> \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 <code>B<\/code> \u043f\u043e\u0434\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0432\u0445\u043e\u0434 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0443-\u0441\u043b\u0438\u0432\u0430\u0442\u043e\u0440\u0443, \u0438 \u043e\u043d \u0441\u0430\u043c \u043a\u0443\u0434\u0430-\u0442\u043e \u0442\u0430\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f. \u042d\u0442\u043e \u044f \u0432\u0430\u043c \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043b <code>a1, a2, b2<\/code> \u0438 \u0432\u0440\u043e\u0434\u0435 \u0432\u0441\u0451 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043d\u043e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432\u0438\u0434\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0438 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b &#171;\u043e\u0442\u043a\u0443\u0434\u0430 \u043e\u043d\u043e \u043f\u0440\u0438\u0448\u043b\u043e&#187;, &#171;\u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0440\u0430\u043d\u044c\u0448\u0435&#187; \u0438 &#171;\u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u043b\u044c\u0448\u0435&#187; \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u043b\u0435\u0433\u043a\u043e \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c. \u0421\u0440\u0430\u0432\u043d\u0438\u0442\u0435:<\/p>\n<pre><code class=\"python\">A = ['a1', 'a2'] B = ['b2', 'b4'] merged = sorted(A + B, key=lambda item: int(item[1:]))  print('\u0412\u043e\u0442 \u0432\u0441\u0451 \u0447\u0442\u043e \u0435\u0441\u0442\u044c:', merged)  for i, item in enumerate(merged): print('\u0411\u044b\u043b\u043e:', merged[:i], '\u0429\u0430\u0441:', item, '\u0411\u0443\u0434\u0435\u0442:', merged[i+1:])  print('\u0414\u0430\u0432\u0430\u0439 \u0435\u0449\u0451 \u0440\u0430\u0437 \u041d\u0430\u0441\u0442\u044f!') for i, item in enumerate(merged): print('\u0411\u044b\u043b\u043e:', merged[:i], '\u0429\u0430\u0441:', item, '\u0411\u0443\u0434\u0435\u0442:', merged[i+1:])  # \u0412\u043e\u0442 \u0432\u0441\u0451 \u0447\u0442\u043e \u0435\u0441\u0442\u044c: ['a1', 'a2', 'b2', 'b4'] # \u0411\u044b\u043b\u043e: [] \u0429\u0430\u0441: a1 \u0411\u0443\u0434\u0435\u0442: ['a2', 'b2', 'b4'] # \u0411\u044b\u043b\u043e: ['a1'] \u0429\u0430\u0441: a2 \u0411\u0443\u0434\u0435\u0442: ['b2', 'b4'] # \u0411\u044b\u043b\u043e: ['a1', 'a2'] \u0429\u0430\u0441: b2 \u0411\u0443\u0434\u0435\u0442: ['b4'] # \u0411\u044b\u043b\u043e: ['a1', 'a2', 'b2'] \u0429\u0430\u0441: b4 \u0411\u0443\u0434\u0435\u0442: [] # \u0414\u0430\u0432\u0430\u0439 \u0435\u0449\u0451 \u0440\u0430\u0437 \u041d\u0430\u0441\u0442\u044f! # \u0411\u044b\u043b\u043e: [] \u0429\u0430\u0441: a1 \u0411\u0443\u0434\u0435\u0442: ['a2', 'b2', 'b4'] # \u0411\u044b\u043b\u043e: ['a1'] \u0429\u0430\u0441: a2 \u0411\u0443\u0434\u0435\u0442: ['b2', 'b4'] # \u0411\u044b\u043b\u043e: ['a1', 'a2'] \u0429\u0430\u0441: b2 \u0411\u0443\u0434\u0435\u0442: ['b4'] # \u0411\u044b\u043b\u043e: ['a1', 'a2', 'b2'] \u0429\u0430\u0441: b4 \u0411\u0443\u0434\u0435\u0442: []<\/code><\/pre>\n<p>vs<\/p>\n<pre><code class=\"python\">A = ('a1', 'a2') B = ('b2', 'b4')              merged = merge_iter(A, B, key=lambda item: int(item[1:]))  print('\u0412\u043e\u0442 \u0432\u0441\u0451 \u0447\u0442\u043e \u0435\u0441\u0442\u044c:', merged)  for i, item in enumerate(merged):     print('\u0411\u044b\u043b\u043e:', '\u0445\u0437', '\u0429\u0430\u0441:', item, '\u0411\u0443\u0434\u0435\u0442:', '\u0445\u0437')  print('\u0414\u0430\u0432\u0430\u0439 \u0435\u0449\u0451 \u0440\u0430\u0437 \u041d\u0430\u0441\u0442\u044f!') for i, item in enumerate(merged):     print('\u0411\u044b\u043b\u043e:', '\u0445\u0437', '\u0429\u0430\u0441:', item, '\u0411\u0443\u0434\u0435\u0442:', '\u0445\u0437')  # \u0412\u043e\u0442 \u0432\u0441\u0451 \u0447\u0442\u043e \u0435\u0441\u0442\u044c: &lt;generator object merge_iter at 0x7f22c81cac70> # \u0411\u044b\u043b\u043e: \u0445\u0437 \u0429\u0430\u0441: a1 \u0411\u0443\u0434\u0435\u0442: \u0445\u0437 # \u0411\u044b\u043b\u043e: \u0445\u0437 \u0429\u0430\u0441: a2 \u0411\u0443\u0434\u0435\u0442: \u0445\u0437 # \u0411\u044b\u043b\u043e: \u0445\u0437 \u0429\u0430\u0441: b2 \u0411\u0443\u0434\u0435\u0442: \u0445\u0437 # \u0411\u044b\u043b\u043e: \u0445\u0437 \u0429\u0430\u0441: b4 \u0411\u0443\u0434\u0435\u0442: \u0445\u0437 # \u0414\u0430\u0432\u0430\u0439 \u0435\u0449\u0451 \u0440\u0430\u0437 \u041d\u0430\u0441\u0442\u044f!<\/code><\/pre>\n<h3>\u041a\u0430\u043a \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c<\/h3>\n<p>\u041c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0432\u043e\u0439\u0442\u0438 <s>\u0432 \u0442\u0443 \u0436\u0435 \u0440\u0435\u043a\u0443<\/s> \u0432 \u0442\u043e\u0442 \u0436\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u043b \u0441\u0435\u0431\u044f, \u0430 \u043f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c \u043f\u0440\u043e\u0445\u043e\u0434\u0435 \u043d\u0435 \u0443\u043f\u0430\u043b, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0432\u0435\u0440\u043d\u0443\u043b \u043d\u0438\u0447\u0435\u0433\u043e. \u0420\u0430\u0437\u0432\u0435 \u044d\u0442\u043e \u043d\u0435 \u044d\u043f\u0438\u0447\u043d\u043e?<\/p>\n<p>\u042f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043f\u043e\u043f\u0430\u0434\u0430\u043b\u0441\u044f \u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0435, \u043a\u043e\u0433\u0434\u0430 \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u043f\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0443 \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437. \u0418\u043d\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u0431\u044b\u043b\u0438 \u043c\u043e\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u0430 \u0438\u043d\u043e\u0433\u0434\u0430 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0443\u043c\u043d\u0438\u043a \u0440\u0435\u0448\u0430\u043b, \u0447\u0442\u043e \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u0432\u0441\u0451 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c memory-efficient, \u0438 \u0442\u0430\u043c, \u0433\u0434\u0435 \u044f \u043e\u0436\u0438\u0434\u0430\u043b \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043c\u0435\u043d\u044f \u0436\u0434\u0430\u043b \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440. \u041e\u043d\u0438, \u0431\u043b\u0438\u043d, \u0432\u043d\u0435\u0448\u043d\u0435 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f!<\/p>\n<p>\u041d\u0443 \u0438 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0442\u0430\u043a \u043b\u0438\u0445\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f. \u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0432 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a, \u0430 \u0442\u0430\u043c \u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>&lt;generator object fuck_you at 0x7f22c81cac70><\/code> &#8212; \u0438 \u0447\u043e \u0441 \u044d\u0442\u0438\u043c \u0434\u0435\u043b\u0430\u0442\u044c? \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435, \u0442\u043e \u043e\u043d \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u0435\u0442\u0441\u044f, \u0438 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0435\u0433\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<h2>\u041d\u0438\u043a\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442<\/h2>\n<p>\u041f\u0438\u0442\u043e\u043d \u0441\u043b\u0438\u0448\u043a\u043e\u043c&#8230; \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439, \u0447\u0442\u043e \u043b\u0438.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044f \u043c\u043e\u0433\u0443 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c \u043f\u0440\u044f\u043c \u0432 \u0442\u0435\u043b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"python\">def foo():     from bar import baz baz() <\/code><\/pre>\n<p>\u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u044d\u0442\u043e \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043f\u0440\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439, \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 &#8212; \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u0438\u043c\u043f\u043e\u0440\u0442 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 <code>bar<\/code> \u0447\u0442\u043e-\u0442\u043e \u043f\u043b\u043e\u0445\u043e, \u0442\u043e \u0443\u0437\u043d\u0430\u0435\u043c \u043c\u044b \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u043c\u043f\u043e\u0440\u0442\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u0437\u043e\u0432\u0430 <code>foo()<\/code>, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 &#8212; \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435.<\/p>\n<p>\u0415\u0449\u0451 \u043c\u043e\u0436\u043d\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u0443\u0433\u043e\u0434\u043d\u043e. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0438\u0436\u0435 \u043f\u043e\u043b\u0437\u0451\u043c \u043f\u043e \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0451, \u0447\u0442\u043e \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u0440\u0443\u043a\u0443, \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438. \u041e\u0447\u0435\u043d\u044c \u0433\u0438\u0431\u043a\u043e, \u043d\u043e \u0438 \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e. IDE \u0432 \u0448\u043e\u043a\u0435!<\/p>\n<pre><code class=\"python\">from importlib import import_module from pathlib import Path  for file in Path(__file__).parent.iterdir():     if not (name := file.stem).startswith('_'):         module = import_module(f'.{name}', __package__)         symbols = [symbol for symbol in module.__dict__ if not symbol.startswith('_')]         globals().update({symbol: getattr(module, symbol) for symbol in symbols}) <\/code><\/pre>\n<p>\u0415\u0449\u0451 \u044f \u043f\u0440\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0435 \u043c\u043e\u0434\u0443\u043b\u044f \u043c\u043e\u0433\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043a\u043e\u0434 &#8212; \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 \u0435\u0441\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f:<\/p>\n<pre><code class=\"python\">def load_huge_table() -> pd.DataFrame:     return pd.read_excel('data_1000000000_rows.xlsx')  HUGE_TABLE = load_huge_table() <\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0443 \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c side effect, \u0438 \u043c\u043d\u0435, \u043a\u0430\u043a \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044e \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e, \u044d\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043f\u043e \u0434\u0443\u0448\u0435.<\/p>\n<p>\u0410 \u0435\u0449\u0451 \u044f \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u043e\u0433\u0443 \u043f\u043e\u0447\u0442\u0438 \u043b\u044e\u0431\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442. \u042f \u043f\u043e\u043c\u043d\u044e \u043f\u0430\u0440\u0443 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u0438\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u0443 &#171;\u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439&#187; \u0430\u0442\u0440\u0438\u0431\u0443\u0442. \u0420\u0443\u0431\u0440\u0438\u043a\u0430 &#171;\u043d\u0430\u0439\u0434\u0438 \u043e\u0448\u0438\u0431\u043a\u0443&#187;:<\/p>\n<pre><code class=\"python\">@app.task def terminate_stale_membership():     \"\"\" If there's no membership payment for a while, stop trying to charge. \"\"\"      stale_period = timedelta(days=60)     for premium in Premium.objects.active().not_paid():         log.debug(premium)         last_payment = premium.payments.filter(paid__isnull=False).latest('end')         now_ = now()         if not last_payment or last_payment.end &lt;= now_ - stale_period:             premium.ends = now_             premium.notes = f'[auto-disabled as stale @ {now_}]'             premium.save()             log.info('Disabled premium renewal for stale membership intent: %s', premium) <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0432\u043c\u0435\u0441\u0442\u043e <code>premium.ends = now_<\/code> \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b\u0442\u044c <code>premium.end = now_<\/code>. \u0412 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043c\u043d\u0435 \u0431\u044b \u0432\u0441\u044b\u043f\u0430\u043b \u0437\u0430 \u0442\u0430\u043a\u0438\u0435 \u0432\u044b\u043a\u0440\u0443\u0442\u0430\u0441\u044b, \u0430 \u0432 \u043f\u0438\u0442\u043e\u043d\u0435 &#8212; \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043c\u0441\u044f \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435!<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u0438\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430:<\/p>\n<pre><code class=\"python\">class MyClass:     def __setattr__(self, attr, value):         print('Nope!')  obj = MyClass() obj.a = 1  # Nope! obj.a  # AttributeError: 'MyClass' object has no attribute 'a' <\/code><\/pre>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u043f\u0440\u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0438!<\/p>\n<p>\u0427\u0442\u043e \u0435\u0449\u0451 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u043f\u0438\u0442\u043e\u043d\u0435? \u041a\u0430\u043a\u0438\u0435-\u0442\u043e <a href=\"https:\/\/habr.com\/ru\/articles\/725340\/\" rel=\"noopener noreferrer nofollow\">\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u0430\u0431\u0440\u0438\u043a\u0438<\/a>. \u0418\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e <a href=\"https:\/\/habr.com\/ru\/companies\/oleg-bunin\/articles\/512650\/\" rel=\"noopener noreferrer nofollow\">\u043d\u0435\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0440\u0430\u0437\u0443\u043c\u043e\u043c \u0432\u0430\u0449\u0438<\/a>.<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u043f\u0438\u0442\u043e\u043d &#8212; \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439. \u041e\u0447\u0435\u043d\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439. \u0414\u0430\u0436\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c. \u041f\u043e \u043c\u043e\u0435\u043c\u0443 \u043e\u043f\u044b\u0442\u0443, \u0432 99% \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043c\u043d\u0435 \u044d\u0442\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0432\u043f\u0451\u0440\u043b\u0430\u0441\u044c &#8212; \u044f \u0437\u043d\u0430\u044e, \u043a\u0430\u043a\u0438\u0435 \u0433\u0434\u0435 \u0442\u0438\u043f\u044b \u043e\u0436\u0438\u0434\u0430\u044e\u0442\u0441\u044f \u0438 \u043a\u0430\u043a\u0438\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0443 \u043c\u043e\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043d\u043e \u044f \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u043b\u0430\u0447\u0443 \u0437\u0430 &#171;\u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c&#187; \u043f\u0438\u0442\u043e\u043d\u0430. \u041f\u043b\u0430\u0447\u0443 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<p>\u041f\u0438\u0442\u043e\u043d \u0447\u0442\u043e-\u0442\u043e \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f. \u0415\u0441\u0442\u044c type hints, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 IDE \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u043a\u0443 (\u043d\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0451), \u0435\u0441\u043b\u0438 <code>@dataclass(slots=True)<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u043d\u0435\u043c\u043d\u043e\u0433\u043e &#171;\u0441\u0442\u0440\u043e\u0436\u0435&#187; (\u043d\u043e \u0442\u0438\u043f\u044b \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0435 \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442, \u0445\u0430-\u0445\u0430), \u0435\u0441\u0442\u044c pydantic, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 <a href=\"https:\/\/stackoverflow.com\/questions\/50563546\/validating-detailed-types-in-python-dataclasses\/55910982#55910982\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0440\u0430\u0435\u0442\u0441\u044f<\/a> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0442\u0438\u043f\u044b, \u043d\u043e \u0432 \u0446\u0435\u043b\u043e\u043c \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0442\u0430\u043a\u0430\u044f: \u0435\u0441\u0442\u044c &#171;\u0441\u0442\u0440\u043e\u0433\u0438\u0435&#187; \u044f\u0437\u044b\u043a\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0445\u0440\u0435\u043d\u044c &#8212; \u043d\u0430\u0434\u043e \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f, \u0430 \u0435\u0441\u0442\u044c &#171;\u0425\u0425\u0438\u0412\u041f-\u044f\u0437\u044b\u043a\u0438&#187;, \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e\u0431\u044b <em>\u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0445\u0440\u0435\u043d\u044c<\/em>. \u041f\u0438\u0442\u043e\u043d, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b \u044f\u0437\u044b\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438 \u0441\u0442\u0440\u043e\u0433\u0438\u0435, \u0438 \u0433\u0438\u0431\u043a\u0438\u0435, \u0442\u043e \u043f\u043e\u0433\u043b\u044f\u0434\u0438\u0442\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u043d\u0430 <a href=\"https:\/\/nim-lang.org\" rel=\"noopener noreferrer nofollow\">nim<\/a> &#8212; \u0445\u043e\u0442\u044f \u0443 \u043d\u0435\u0433\u043e \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043f\u0440\u0430\u0432\u0434\u0430, \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0440\u043e\u0434\u0430.<\/p>\n<h2>Mutable defaults<\/h2>\n<p>\u0423 \u043c\u0435\u043d\u044f \u0433\u043e\u0440\u0438\u0442! \u041d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0437\u044f\u0442\u044c \u0438 \u0437\u0430\u0434\u0430\u0442\u044c, \u0441\u043a\u0430\u0436\u0435\u043c, \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430:<\/p>\n<pre><code class=\"python\">def foo(items: list[str] = []):     items.append(1)     print(items)  foo()  # [1] foo()  # [1, 1] foo()  # [1, 1, 1] <\/code><\/pre>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0435, \u0442\u0430\u043a \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, \u0442\u043e \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u0430\u0442\u0442\u0435\u0440\u043d &#171;\u044f \u0445\u043e\u0447\u0443 mutable default&#187;:<\/p>\n<pre><code class=\"python\">def foo(items: list[str] | None = None):     items = items or []  # \u0438\u043b\u0438 if items is None: items = []     items.append(1)     print(items)  foo()  # [1] foo()  # [1] foo()  # [1] <\/code><\/pre>\n<p>\u0412 \u0434\u0430\u0442\u0430\u043a\u043b\u0430\u0441\u0441\u0430\u0445 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0435\u0449\u0451 \u0443\u0436\u0430\u0441\u043d\u0435\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0437\u0433\u043b\u044f\u043d\u0438\u0442\u0435:<\/p>\n<pre><code class=\"python\">from dataclasses import dataclass, field  @dataclass class Foo:     items: list[str] = field(default_factory=list)  # &lt;-- \u0438 \u0432\u0441\u0451 \u044d\u0442\u043e - \u0447\u0442\u043e\u0431\u044b \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0431\u044b\u043b \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a <\/code><\/pre>\n<p>\u0421\u0440\u0430\u0432\u043d\u0438\u0442\u0435 \u044d\u0442\u043e \u0441 \u043f\u0438\u0434\u0430\u043d\u0442\u0438\u043a\u043e\u043c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0434\u0443\u043c\u0430\u044e\u0442 \u043e \u043b\u044e\u0434\u044f\u0445:<\/p>\n<pre><code class=\"python\">from pydantic import BaseModel  class Foo(BaseModel):     items: list[str] = [] <\/code><\/pre>\n<p>\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u043e\u0441\u043e\u0437\u043d\u0430\u043b, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f &#171;\u0447\u0438\u0441\u0442\u0430\u044f&#187;, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439:<\/p>\n<pre><code class=\"python\">def foo(var: int, checks: list[Callable] = []): for check in checks: check(var) <\/code><\/pre>\n<p>\u041d\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e &#171;\u043d\u043e&#187;:<\/p>\n<ol>\n<li>\n<p>\u041b\u0438\u043d\u0442\u0435\u0440\u0443 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u0442\u044c\u0441\u044f<\/p>\n<\/li>\n<li>\n<p>\u041a\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0440\u0435\u0448\u0438\u0442, \u0447\u0442\u043e \u0435\u043c\u0443 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0438 \u0432\u0441\u0451 \u0441\u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f<\/p>\n<\/li>\n<li>\n<p>\u0414\u0440\u0443\u0433\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431 \u043c\u043e\u0436\u0435\u0442<\/p>\n<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-351773","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/351773","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=351773"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/351773\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=351773"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=351773"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=351773"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}