{"id":326207,"date":"2021-07-09T15:00:11","date_gmt":"2021-07-09T15:00:11","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=326207"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=326207","title":{"rendered":"\u0410\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 Python"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043a\u0442\u043e-\u0442\u043e \u0438\u0437 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439, \u0443\u0432\u0438\u0434\u0435\u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u043f\u043e\u0434\u0443\u043c\u0430\u0435\u0442 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0432\u0440\u043e\u0434\u0435:<\/p>\n<p><em>&#171;\u0427\u0442\u043e?! \u0410\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445?! \u042d\u0442\u043e \u0436\u0435 \u0447\u0442\u043e-\u0442\u043e \u0438\u0437 \u043c\u0438\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. Python?! \u041d\u0443 \u043d\u0435\u0442&#8230; \u0413\u0434\u0435 Python \u0441\u043e \u0441\u0432\u043e\u0435\u0439 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0443\u0442\u0438\u043d\u043e\u0439 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0435\u0439,&nbsp;\u0430 \u0433\u0434\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0443\u0436 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0435&#8230;&#187;<\/em><\/p>\n<p>\u0427\u0442\u043e-\u0442\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0434\u0443\u0445\u0435. \u041d\u043e, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0432 Python \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u044f&nbsp;<a href=\"https:\/\/docs.python.org\/3\/reference\/datamodel.html#the-standard-type-hierarchy\" rel=\"noopener noreferrer nofollow\">\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0438\u043f\u043e\u0432<\/a>, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e Python \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u044f\u0437\u044b\u043a\u043e\u043c \u0441\u043e&nbsp;<em>\u0441\u0442\u0440\u043e\u0433\u043e\u0439 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0435\u0439<\/em>, \u0430 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f&nbsp;<a href=\"http:\/\/www.mypy-lang.org\/\" rel=\"noopener noreferrer nofollow\">mypy<\/a>&nbsp;\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0435\u0437 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041f\u043e\u043c\u0438\u043c\u043e \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439, \u0432 Python \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0441&nbsp;<em>\u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>. \u0422\u0430\u043a \u0447\u0442\u043e \u0436\u0435 \u044d\u0442\u043e \u0437\u0430 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u0430\u043a \u043e\u043d\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0432 Python, \u0438 \u043a\u0430\u043a\u0443\u044e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u043e\u043b\u044c\u0437\u0443 \u043f\u0440\u0438\u043d\u043e\u0441\u044f\u0442 \u2014 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e51\/632\/ce9\/e51632ce9dfa50bd8077577b1e675c0c.jpg\" width=\"1400\" height=\"900\"><figcaption><\/figcaption><\/figure>\n<h3>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/h3>\n<ul>\n<li>\n<p><a href=\"#%D0%BD%D0%B5%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B5-%D0%B2%D1%81%D1%82%D1%83%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0432\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#1-%D0%B8-0\" rel=\"noopener noreferrer nofollow\">1 \u0438 0<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D1%82%D0%B8%D0%BF-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0422\u0438\u043f-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D1%82%D0%B8%D0%BF-%D1%81%D1%83%D0%BC%D0%BC%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0422\u0438\u043f-\u0441\u0443\u043c\u043c\u0430<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#optional-%D0%B8%D0%BB%D0%B8-%D0%BE%D1%82%D1%81%D1%83%D1%82%D1%81%D1%82%D0%B2%D0%B8%D0%B5-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">Optional \u0438\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#%D1%81%D0%BE%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC-%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80-%D0%B8%D0%B7-%D1%82%D0%B8%D0%BF%D0%BE%D0%B2\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438\u0437 \u0442\u0438\u043f\u043e\u0432<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#%D1%81%D0%BE%D0%BF%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81-%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D1%86%D0%BE%D0%BC\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#%D0%B2-%D1%87%D1%91%D0%BC-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0412 \u0447\u0451\u043c \u043f\u043e\u043b\u044c\u0437\u0430?<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8-%D0%BF%D0%BE-%D1%82%D0%B5%D0%BC%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0421\u0441\u044b\u043b\u043a\u0438 \u043f\u043e \u0442\u0435\u043c\u0435<\/a><\/p>\n<\/li>\n<\/ul>\n<p><em>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435. \u0414\u0430\u043b\u0435\u0435 \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 Python 3.9 \u0438 3.10, \u0430 \u0442\u0430\u043a\u0436\u0435&nbsp;<\/em><a href=\"http:\/\/www.mypy-lang.org\/\" rel=\"noopener noreferrer nofollow\"><em>mypy<\/em><\/a><em>&nbsp;\u0432\u0435\u0440\u0441\u0438\u0438 0.910 (\u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438&nbsp;<\/em><a href=\"https:\/\/pastebin.com\/DRnwcW6X\" rel=\"noopener noreferrer nofollow\"><em>\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438<\/em><\/a><em>) \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u0442\u0438\u043f\u043e\u0432.<\/em><\/p>\n<p><a class=\"anchor\" name=\"%D0%BD%D0%B5%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B5-%D0%B2%D1%81%D1%82%D1%83%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5\" id=\"\u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435-\u0432\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435\"><\/a><\/p>\n<h3>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0432\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0421\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0435\u0441\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u0432\u0438\u0434\u0435, \u0442\u043e \u0432\u044b \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435&nbsp;<em>\u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/em>, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0435 \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u044f \u043e\u0431 \u044d\u0442\u043e\u043c.&nbsp; \u041f\u043e\u0434 \u044d\u0442\u0438\u043c&nbsp;\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u043a\u0430\u0434\u0435\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u043e\u043d\u044f\u0442\u0438\u0435\u043c \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0438\u0434\u0435\u044f&nbsp;<em>\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438<\/em>&nbsp;\u2014 \u043a\u0430\u043a \u0438\u0437 \u043e\u0434\u043d\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435, \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 (\u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u044d\u0442\u0443 \u0438\u0434\u0435\u044e&nbsp;<em>\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438<\/em>&nbsp;\u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043d\u0430\u043c\u0435\u043a\u0430\u0435\u0442 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043d\u0430 \u043e\u0431\u043b\u043e\u0436\u043a\u0435 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438). \u0418\u0442\u0430\u043a,&nbsp;<em>\u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445<\/em>&nbsp;\u2014 \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f&nbsp;<em>\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439<\/em>&nbsp;\u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432. \u0412\u043e\u0442 \u0442\u0430\u043a\u043e\u0435 \u043d\u0435\u0437\u0430\u0442\u0435\u0439\u043b\u0438\u0432\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435.&nbsp;<em>\u0410\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0435<\/em>&nbsp;\u0436\u0435 \u044d\u0442\u0438 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e \u0444\u0430\u043a\u0442\u0430, \u0447\u0442\u043e \u043d\u043e\u0432\u044b\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u0432 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f. \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0437 \u0441\u0435\u0431\u044f \u0441\u0443\u043c\u043c\u0430 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435&nbsp;<em>\u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445<\/em>&nbsp;\u0432\u043e\u043e\u0431\u0449\u0435.<\/p>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u0443\u043c\u0430\u0442\u044c \u043e&nbsp;<em>\u0442\u0438\u043f\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>&nbsp;\u2014 \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0442\u0438\u043f \u043a\u0430\u043a&nbsp;<em>\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0432\u0441\u0435\u0445 \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<\/em>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0438\u043f&nbsp;<code>bool<\/code>&nbsp;\u2014 \u044d\u0442\u043e \u0434\u0432\u0443\u0445\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043d\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b&nbsp;<code>True<\/code>&nbsp;\u0438&nbsp;<code>False<\/code>. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439&nbsp;<em>\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0439 \u0442\u0438\u043f<\/em>&nbsp;<code>Color<\/code>:<\/p>\n<pre><code class=\"python\">from enum import Enum  class Color(Enum):     Red = \"r\"     Green = \"g\"     Blue = \"b\"<\/code><\/pre>\n<p>\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. \u0422\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445&nbsp;<code>int<\/code>&nbsp;\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0432\u0441\u0435\u0445 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b. \u0410 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445&nbsp;<code>str<\/code>&nbsp;\u2014 \u044d\u0442\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e, \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430, \u0441\u0442\u0440\u043e\u043a\u0438&nbsp;<code>\"\u043f\u0440\u0438\u0432\u0435\u0442\"<\/code>&nbsp;\u0438&nbsp;<code>\"hello\"<\/code>, \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0432\u0430\u0448\u0435\u0439 \u043b\u044e\u0431\u0438\u043c\u043e\u0439 \u043f\u0435\u0441\u043d\u0438, \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0412 \u043e\u0431\u0449\u0435\u043c, \u043a\u0430\u043a \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445&nbsp;<code>str<\/code>&nbsp;\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442&nbsp;<em>\u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e<\/em>&nbsp;\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p><a class=\"anchor\" name=\"1-%D0%B8-0\" id=\"1-\u0438-0\"><\/a><\/p>\n<h3>1 \u0438 0<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u0443\u043c\u0430\u0442\u044c \u043e \u043a\u0430\u043a\u043e\u043c-\u0442\u043e&nbsp;<em>\u0442\u0438\u043f\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>&nbsp;\u043a\u0430\u043a \u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0442\u043e \u0447\u0442\u043e \u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f&nbsp;<em>\u043e\u0434\u043d\u043e\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043d\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e<\/em>, \u0438\u043b\u0438 \u0432\u043e\u0432\u0441\u0435&nbsp;<em>\u043f\u0443\u0441\u0442\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e<\/em>? \u0412 Python \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043c\u0435\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,&nbsp;<code>None<\/code>&nbsp;\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u0438\u043f\u0430&nbsp;<code>NoneType<\/code>. \u0412 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u0445 \u0442\u0438\u043f\u043e\u0432 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e \u0444\u0430\u043a\u0442\u0430, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 (\u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f&nbsp;<em>\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043e\u0439<\/em>, \u0430 \u043d\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439):<\/p>\n<pre><code class=\"python\">def do_something_interesting(value: int) -&gt; None:     ...<\/code><\/pre>\n<p>\u0414\u0440\u0443\u0433\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0439 \u043a\u043e\u0440\u0442\u0435\u0436 (tuple):<\/p>\n<pre><code class=\"python\">from typing import Tuple  empty: Tuple[()] = ()<\/code><\/pre>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435&nbsp;<code>()<\/code>&nbsp;\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0432\u0441\u0435\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430&nbsp;<code>Tuple[()]<\/code>. \u0415\u0441\u0442\u044c \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u043d\u043e \u043e\u0431\u0449\u0438\u0439 \u0441\u043c\u044b\u0441\u043b, \u0434\u0443\u043c\u0430\u044e, \u043f\u043e\u043d\u044f\u0442\u0435\u043d. \u041f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f&nbsp;<em>\u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0435\u0441\u0442\u0438 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u043e\u043b\u044c\u0437\u0443. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"python\">from enum import Enum from typing import Union  class Default(Enum):     Value = 0  def process(value: Union[int, None, Default] = Default.Value) -&gt; int:     if value is Default.Value:         return 0     elif value is None:         return 1     else:         # \u0412 \u044d\u0442\u043e\u0439 \u0432\u0435\u0442\u043a\u0435 mypy \"\u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\", \u0447\u0442\u043e value \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f int,          # \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0430         return value * 2<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430,&nbsp;<code>None<\/code>&nbsp;\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u0430&nbsp;<code>Default<\/code>&nbsp;\u0438 \u0435\u0433\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f&nbsp;<code>Default.Value<\/code>&nbsp;\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u0431\u0435\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432&nbsp;<code>process()<\/code>, \u043e\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430&nbsp;<code>None<\/code>&nbsp;\u044f\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438&nbsp;<code>process(None)<\/code>, \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0432\u0435\u0442\u043a\u0443 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430&nbsp;<code>if<\/code>.<\/p>\n<p>\u041e\u0442\u043b\u0438\u0447\u043d\u043e, \u043d\u043e \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u0442\u0438\u043f\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430\u043c. \u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438&nbsp;<em>\u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c\u044b \u0432 \u0432\u0438\u0434\u0435 \u043e\u0434\u043d\u043e\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u0443\u0441\u0442\u044b\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c. \u0422\u0430\u043a \u0437\u0430\u0447\u0435\u043c \u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0443\u0436\u0435\u043d \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442? \u041f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442&nbsp;<em>\u043d\u0435\u043d\u0430\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u043c<\/em>&nbsp;(uninhabited type), \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0435\u0432\u044b\u0447\u0438\u0441\u043b\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u0440\u043e\u0448\u0435\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b, \u0438 \u0442.\u043f. \u0412 Python \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0442\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code class=\"python\">from typing import NoReturn  def stop() -&gt; NoReturn:     raise RuntimeError(\"\u041d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f!\")<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0436\u0435 \u043c\u044b \u0447\u0442\u043e-\u0442\u043e \u043d\u0430\u043f\u0443\u0442\u0430\u0435\u043c \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0437 \u0442\u0430\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"python\">from typing import NoReturn  def stop(value: int) -&gt; NoReturn:     if value &lt; 0:         return 42     raise RuntimeError(\"\u041d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f!\")<\/code><\/pre>\n<p>\u0442\u043e, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0432 mypy, \u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u0443\u0432\u0438\u0434\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<pre><code>error: Return statement in function which does not return     return 42<\/code><\/pre>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0435\u0441\u043b\u0438 \u0442\u0438\u043f \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d&nbsp;<code>NoReturn<\/code>, \u0442\u043e \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u044d\u0442\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043d\u0438 \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0442\u0430\u043a \u043a\u0430\u043a&nbsp;<code>NoReturn<\/code>&nbsp;\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f&nbsp;<em>\u043d\u0435\u043d\u0430\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u043c<\/em>&nbsp;\u0442\u0438\u043f\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u0438, \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442:<\/p>\n<pre><code class=\"python\">from typing import NoReturn  value: NoReturn = None other_value: NoReturn = ()<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u0442\u0438\u043f\u043e\u0432 mypy \u0441\u043e\u043e\u0431\u0449\u0438\u0442 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435:<\/p>\n<pre><code>error: Incompatible types in assignment (expression has type \"None\", variable has type \"NoReturn\")     value = None  error: Incompatible types in assignment (expression has type \"Tuple[]\", variable has type \"NoReturn\")     other_value: NoReturn = ()<\/code><\/pre>\n<p><a class=\"anchor\" name=\"%D1%82%D0%B8%D0%BF-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5\" id=\"\u0442\u0438\u043f-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435\"><\/a><\/p>\n<h3>\u0422\u0438\u043f-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0421\u043b\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0435\u0437 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438&nbsp;<em>\u0442\u0438\u043f\u043e\u0432-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0439<\/em>&nbsp;(product type). \u042d\u0442\u043e, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0432 \u0438\u0445 \u0432\u043c\u0435\u0441\u0442\u0435. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0438\u043f\u0430-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u2014 \u043a\u043e\u0440\u0442\u0435\u0436 \u0438\u0437 \u0434\u0432\u0443\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0438\u043b\u0438&nbsp;<em>\u043f\u0430\u0440\u0430<\/em>:<\/p>\n<pre><code class=\"python\">from enum import Enum from typing import Tuple  class ChessPieceType(Enum):     \"\"\"\u0422\u0438\u043f \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u044b.\"\"\"     King = \"\u041a\u043e\u0440\u043e\u043b\u044c\"     Queen = \"\u0424\u0435\u0440\u0437\u044c\"     Rook = \"\u041b\u0430\u0434\u044c\u044f\"     Bishop = \"\u0421\u043b\u043e\u043d\"     Knight = \"\u041a\u043e\u043d\u044c\"     Pawn = \"\u041f\u0435\u0448\u043a\u0430\"  class ChessPieceColor(Enum):     \"\"\"\u0426\u0432\u0435\u0442 \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u044b.\"\"\"     White = \"\u0411\u0435\u043b\u044b\u0439\"     Black = \"\u0427\u0435\u0440\u043d\u044b\u0439\"  ChessPiece = Tuple[ChessPieceType, ChessPieceColor]  # \u0411\u0435\u043b\u044b\u0439 \u043a\u043e\u0440\u043e\u043b\u044c white_king: ChessPiece = (ChessPieceType.King, ChessPieceColor.White) # \u0427\u0435\u0440\u043d\u044b\u0439 \u0444\u0435\u0440\u0437\u044c black_queen: ChessPiece = (ChessPieceType.Queen, ChessPieceColor.Black)<\/code><\/pre>\n<p>\u0412 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0435&nbsp;<code>ChessPiece<\/code>&nbsp;\u2014 \u044d\u0442\u043e \u0442\u0438\u043f-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435&nbsp;<em>\u043f\u0430\u0440\u0430<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439 \u0434\u0432\u0443\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432: \u0442\u0438\u043f\u0430 \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u044b&nbsp;<code>ChessPieceType<\/code>&nbsp;\u0438 \u0446\u0432\u0435\u0442\u0430&nbsp;<code>ChessPieceColor<\/code>. \u0423\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f&nbsp;<em>\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c<\/em>. \u0422\u0438\u043f&nbsp;<code>ChessPieceType<\/code>&nbsp;\u0438\u043c\u0435\u0435\u0442 6 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0430 \u0442\u0438\u043f&nbsp;<code>ChessPieceColor<\/code>&nbsp;\u0438\u043c\u0435\u0435\u0442 2 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430&nbsp;<code>ChessPiece<\/code>&nbsp;\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f&nbsp;<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D1%8F%D0%BC%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0434\u0435\u043a\u0430\u0440\u0442\u043e\u0432\u044b\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c<\/a>&nbsp;\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0434\u0432\u0443\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432, \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 12 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6e1\/089\/a2d\/6e1089a2d63d4801e07fd353672d52a2.jpeg\" width=\"880\" height=\"519\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u0430\u044f \u0444\u0438\u0433\u0443\u0440\u0430&nbsp;<code>ChessPiece<\/code>&nbsp;\u2014 \u044d\u0442\u043e \u0442\u0438\u043f \u0444\u0438\u0433\u0443\u0440\u044b&nbsp;<code>ChessPieceType<\/code>&nbsp;<strong>\u0418<\/strong>&nbsp;\u0446\u0432\u0435\u0442 \u0444\u0438\u0433\u0443\u0440\u044b&nbsp;<code>ChessPieceColor<\/code>. \u041c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0435 \u043a\u0430\u043a\u0438\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u044b \u043d\u0430\u0448\u0435\u043c\u0443 \u0442\u0438\u043f\u0443-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430 \u0434\u043e\u0441\u043a\u0435&nbsp;<code>PositionOnBoard<\/code>:<\/p>\n<pre><code class=\"python\"># \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430  # \u0428\u0430\u0445\u043c\u0430\u0442\u043d\u0430\u044f \u0444\u0438\u0433\u0443\u0440\u0430 \u2014 \u044d\u0442\u043e \u0442\u0438\u043f \u0444\u0438\u0433\u0443\u0440\u044b  #   \u0418 \u0446\u0432\u0435\u0442 \u0444\u0438\u0433\u0443\u0440\u044b  #   \u0418 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0444\u0438\u0433\u0443\u0440\u044b \u043d\u0430 \u0434\u043e\u0441\u043a\u0435 ChessPiece = Tuple[ChessPieceType, ChessPieceColor, PositionOnBoard]<\/code><\/pre>\n<p>\u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430&nbsp;<code>ChessPiece<\/code>&nbsp;\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u0441\u044f \u0434\u043e 768 (6 \u0442\u0438\u043f\u043e\u0432&nbsp;<strong>x<\/strong>&nbsp;2 \u0446\u0432\u0435\u0442\u0430&nbsp;<strong>x<\/strong>&nbsp;64 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438).<\/p>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u043a\u043e\u0440\u0442\u0435\u0436\u0435\u0439, \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0442\u0438\u043f\u0430\u043c-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b (struct), \u043a\u043b\u0430\u0441\u0441\u044b \u043e\u0431\u0440\u0430\u0437\u0446\u044b (case class), \u0437\u0430\u043f\u0438\u0441\u0438 (record), \u0438 \u0442.\u043f. \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0438\u043f-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 Python \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u0430&nbsp;<em>dataclass<\/em>&nbsp;\u0438\u0437 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e&nbsp;<a href=\"https:\/\/docs.python.org\/3\/library\/dataclasses.html\" rel=\"noopener noreferrer nofollow\">\u043c\u043e\u0434\u0443\u043b\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438<\/a>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0442\u0438\u043f:<\/p>\n<pre><code class=\"python\">from dataclasses import dataclass from enum import Enum  class Role(Enum):     Administrator = 0     Editor = 1     Reader = 2  @dataclass(frozen=True) class User:     name: str     role: Role     is_active: bool<\/code><\/pre>\n<p>\u0422\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445&nbsp;<code>User<\/code>&nbsp;\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439 \u0442\u0438\u043f\u043e\u0432&nbsp;<code>str<\/code>,&nbsp;<code>Role<\/code>&nbsp;\u0438&nbsp;<code>bool<\/code>. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&nbsp;<code>User<\/code>&nbsp;\u2014 \u044d\u0442\u043e \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f&nbsp;<code>str<\/code>&nbsp;<strong>\u0418<\/strong>&nbsp;\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f&nbsp;<code>Role<\/code>&nbsp;<strong>\u0418<\/strong>&nbsp;\u0444\u043b\u0430\u0433 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438&nbsp;<code>bool<\/code>.<\/p>\n<p>\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0439 mypy \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043e\u0442\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u043e\u043b\u044e:<\/p>\n<pre><code class=\"python\"># \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430  def get_user_info(user: User) -&gt; str:     # \u0410\u0432\u0442\u043e\u0440\u0443 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e 42      # \u043a \u0438\u043c\u0435\u043d\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f...     name = user.name + 42     return f\"{name}: {user.role.name} {user.is_active}\"<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, mypy \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043d\u0430\u0441 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0432 \u0442\u0430\u043a\u043e\u043c \u043a\u043e\u0434\u0435:<\/p>\n<pre><code>error: Unsupported operand types for + (\"str\" and \"int\")     name = user.name + 42<\/code><\/pre>\n<p>\u041d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435&nbsp;<em>\u043d\u0435\u043d\u0430\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438, \u043f\u0440\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0442\u0438\u043f\u0430-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"python\">from dataclasses import dataclass from typing import NoReturn  @dataclass(frozen=True) class Ooops:     number: int     string: str     nothing: NoReturn<\/code><\/pre>\n<p>\u0421\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0443 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445? \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430&nbsp;<code>int<\/code>&nbsp;<strong>x<\/strong>&nbsp;\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430&nbsp;<code>str<\/code>&nbsp;<strong>x<\/strong>&nbsp;0 (\u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430&nbsp;<code>NoReturn<\/code>). \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0443 \u0442\u0438\u043f\u0430&nbsp;<code>Ooops<\/code>&nbsp;\u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0438 \u0442\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u0442\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0435\u0442&nbsp;<em>\u043d\u0435\u043d\u0430\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u043c<\/em>. \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043a\u0430\u043a-\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430:<\/p>\n<pre><code class=\"python\"># \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430  Ooops(42, \"hello\", None)<\/code><\/pre>\n<p>\u0422\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u043e\u0442 mypy:<\/p>\n<pre><code>error: Argument 3 to \"Ooops\" has incompatible type \"None\"; expected \"NoReturn\"     Ooops(42, \"hello\", None)<\/code><\/pre>\n<p>\u0412 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u2014 \u044d\u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445.<\/p>\n<p><a class=\"anchor\" name=\"%D1%82%D0%B8%D0%BF-%D1%81%D1%83%D0%BC%D0%BC%D0%B0\" id=\"\u0442\u0438\u043f-\u0441\u0443\u043c\u043c\u0430\"><\/a><\/p>\n<h3>\u0422\u0438\u043f-\u0441\u0443\u043c\u043c\u0430<\/h3>\n<p><em>\u0422\u0438\u043f-\u0441\u0443\u043c\u043c\u0430<\/em>&nbsp;(sum type) \u2014 \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c&nbsp;<em>\u043e\u0434\u043d\u0438\u043c \u0438\u0437<\/em>&nbsp;\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u0437\u0430\u0438\u043c\u043e\u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0442\u0438\u043f\u043e\u0432-\u0441\u0443\u043c\u043c \u0440\u0435\u0436\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0442\u0438\u043f\u0430\u043c\u0438-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f\u043c\u0438. \u0412 \u044f\u0437\u044b\u043a\u0430\u0445, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0430\u043a\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f&nbsp;<em>\u0440\u0430\u0437\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f\u043c\u0438<\/em>&nbsp;(tagged union) \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e&nbsp;<em>\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u043c\u0438<\/em>&nbsp;(variant). \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e&nbsp;<em>\u0442\u0438\u043f-\u0441\u0443\u043c\u043c\u0430<\/em>&nbsp;\u0438 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0443, \u043a\u043e\u0433\u0434\u0430 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043e\u0431&nbsp;<em>\u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0442\u0438\u043f\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>.<\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u0442\u0438\u043f\u0430-\u0441\u0443\u043c\u043c\u044b \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u0438\u043f&nbsp;<code>bool<\/code>. \u0427\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430&nbsp;<code>bool<\/code>? \u042d\u0442\u043e&nbsp;<code>True<\/code>&nbsp;<strong>\u0418\u041b\u0418<\/strong>&nbsp;<code>False<\/code>&nbsp;\u2014 \u0434\u0432\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430. \u0415\u0449\u0435 \u043e\u0434\u043d\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0439 \u0442\u0438\u043f&nbsp;<code>Fruit<\/code>:<\/p>\n<pre><code class=\"python\">from enum import Enum  class Fruit(Enum):     Apple = \"\u044f\u0431\u043b\u043e\u043a\u043e\"     Banana = \"\u0431\u0430\u043d\u0430\u043d\"     Peach = \"\u043f\u0435\u0440\u0441\u0438\u043a\"<\/code><\/pre>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430&nbsp;<code>Fruit<\/code>&nbsp;\u2014 \u044d\u0442\u043e&nbsp;<code>Fruit.Apple<\/code>&nbsp;<strong>\u0418\u041b\u0418<\/strong>&nbsp;<code>Fruit.Banana<\/code>&nbsp;<strong>\u0418\u041b\u0418<\/strong>&nbsp;<code>Fruit.Peach<\/code>. \u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u0430\u044f \u0438\u0434\u0435\u044f. \u041d\u043e \u0434\u0430\u043b\u0435\u0435 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0442\u0438\u043f\u044b-\u0441\u0443\u043c\u043c\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043c\u043e\u0449\u043d\u044b\u043c \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<p>\u0422\u0438\u043f-\u0441\u0443\u043c\u043c\u0430 \u2014 \u044d\u0442\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u041a\u0430\u0436\u0434\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0442\u0438\u043f\u0430-\u0441\u0443\u043c\u043c\u044b \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0442\u0438\u043f. \u0412 Python \u0434\u043b\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u0438\u0434\u0435\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0442\u0438\u043f&nbsp;<code>Union<\/code>&nbsp;\u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u044f&nbsp;<code>typing<\/code>:<\/p>\n<pre><code class=\"python\">from enum import Enum from typing import Union  class Fruit(Enum):     Apple = \"\u044f\u0431\u043b\u043e\u043a\u043e\"     Banana = \"\u0431\u0430\u043d\u0430\u043d\"     Peach = \"\u043f\u0435\u0440\u0441\u0438\u043a\"  class Vegetable(Enum):     Cabbage = \"\u043a\u0430\u043f\u0443\u0441\u0442\u0430\"     Carrot = \"\u043c\u043e\u0440\u043a\u043e\u0432\u044c\"  Food = Union[Fruit, Vegetable]  apple: Food = Fruit.Apple  # OK carrot: Food = Vegetable.Carrot  # OK  # Mypy error:  Incompatible types in assignment (expression has type \"int\",  # variable has type \"Union[Fruit, Vegetable]\") hmmm: Food = 42<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430&nbsp;<code>Food<\/code>&nbsp;\u2014 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430&nbsp;<code>Fruit<\/code>&nbsp;<strong>\u0418\u041b\u0418<\/strong>&nbsp;\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430&nbsp;<code>Vegetable<\/code>. \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430&nbsp;<code>Food<\/code>&nbsp;\u2014 \u044d\u0442\u043e&nbsp;<em>\u0441\u0443\u043c\u043c\u0430<\/em>&nbsp;\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u043e\u0432&nbsp;<code>Fruit<\/code>&nbsp;\u0438&nbsp;<code>Vegetable<\/code>, \u0432\u0441\u0435\u0433\u043e 5 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0444\u0440\u0443\u043a\u0442\u043e\u0432 \u0438 \u043e\u0432\u043e\u0449\u0435\u0439.<\/p>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043b\u044e\u0431\u044b\u0445 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\">from dataclasses import dataclass from typing import Union  @dataclass(frozen=True) class AddressDetails:     city: str     street: str     house_number: int  Address = Union[str, AddressDetails]<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c&nbsp;<code>Address<\/code>&nbsp;\u2014 \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430&nbsp;<code>str<\/code>&nbsp;<strong>\u0418\u041b\u0418<\/strong>&nbsp;<code>AddressDetails<\/code>. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c&nbsp;<code>Address<\/code>&nbsp;\u0434\u043b\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439 \u0442\u0438\u043f\u043e\u0432, \u043f\u0440\u0438\u0447\u0435\u043c mypy \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0443 \u0442\u0438\u043f\u0430-\u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"python\"># \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430  def do_something_with_address(address: Address) -&gt; None:     if isinstance(address, str):         print(\"\u0410\u0434\u0440\u0435\u0441 \u2014 \u044d\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430:\", address)     elif isinstance(address, AddressDetails):         print(f\"\u0410\u0434\u0440\u0435\u0441: {address.city}, {address.street}, {address.house_number}\")     else:         assert False, \"\u0411\u043e\u043b\u044c\u0448\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043d\u0435\u0442!\"<\/code><\/pre>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c \u0442\u0438\u043f\u0430-\u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f, \u0438\u043d\u0430\u0447\u0435 mypy \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0430\u0442\u044c \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445.<\/p>\n<p><em>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435. \u0421\u0442\u0440\u043e\u0433\u043e \u0433\u043e\u0432\u043e\u0440\u044f, Union \u2014 \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0442\u0438\u043f-\u0441\u0443\u043c\u043c\u0430 \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e \u0444\u0430\u043a\u0442\u0430, \u0447\u0442\u043e \u0442\u0438\u043f\u044b \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0442\u0438\u043f\u043e\u0432 Python&nbsp;<\/em><code>Union[int, int]<\/code>&nbsp;\u2014 <em>\u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0438 \u043f\u0440\u043e\u0441\u0442\u043e&nbsp;<\/em><code>int<\/code><em>, \u0438 \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u043a\u043e\u0433\u043e \u0438\u0437 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f. \u042d\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b-&#171;\u043e\u0431\u0451\u0440\u0442\u043a\u0438&#187; \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430. \u041d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u044d\u0442\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0435 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/em><\/p>\n<p><a class=\"anchor\" name=\"optional-%D0%B8%D0%BB%D0%B8-%D0%BE%D1%82%D1%81%D1%83%D1%82%D1%81%D1%82%D0%B2%D0%B8%D0%B5-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F\" id=\"optional-\u0438\u043b\u0438-\u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\"><\/a><\/p>\n<h4>Optional \u0438\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f<\/h4>\n<p>\u0415\u0449\u0435 \u043e\u0434\u043d\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u0442\u0438\u043f\u0430-\u0441\u0443\u043c\u043c\u044b \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u0438\u043f&nbsp;<code>Optional<\/code>&nbsp;\u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u044f&nbsp;<code>typing<\/code>&nbsp;\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Python, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0438\u0434\u0435\u044e, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435&nbsp;<em>\u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c<\/em>. \u0422\u0438\u043f&nbsp;<code>Optional[T]<\/code>&nbsp;\u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u0435\u043d \u0442\u0438\u043f\u0443&nbsp;<code>Union[T, None]<\/code>, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430&nbsp;<code>T<\/code>&nbsp;<strong>\u0418\u041b\u0418<\/strong>&nbsp;\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435&nbsp;<code>None<\/code>. \u0415\u0441\u043b\u0438 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0442\u0438\u043f\u0430&nbsp;<code>Optional<\/code>, \u0442\u043e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u044f\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430&nbsp;<em>\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442<\/em>:<\/p>\n<pre><code class=\"python\">from dataclasses import dataclass from typing import Optional  @dataclass(frozen=True) class Article:     id: int     title: str  def fetch_article(article_id: int) -&gt; Optional[Article]:     \"\"\"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0442\u0430\u0442\u044c\u044e \u043f\u043e \u0435\u0451 ID \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c.\"\"\"  def show_article() -&gt; None:     article = fetch_article(42)     print(\"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441\u0442\u0430\u0442\u044c\u0438:\", article.title)<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u0442\u0438\u043f\u043e\u0432 mypy \u043d\u0430\u0439\u0434\u0451\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<pre><code>error: Item \"None\" of \"Optional[Article]\" has no attribute \"title\"     print(\"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441\u0442\u0430\u0442\u044c\u0438:\", article.title)<\/code><\/pre>\n<p>\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c, \u0442\u043e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u044f\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0441\u043b\u0443\u0447\u0430\u0439:<\/p>\n<pre><code class=\"python\"># \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430  def show_article() -&gt; None:     article = fetch_article(42)          if article is None:         print(\"\u0421\u0442\u0430\u0442\u044c\u0438 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.\")     else:         # \u0417\u0434\u0435\u0441\u044c mypy \"\u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\", \u0447\u0442\u043e article \u0442\u043e\u0447\u043d\u043e \u043d\u0435 None,          # \u0442.\u043a. \u0432\u044b\u0448\u0435 \u0432 \u043a\u043e\u0434\u0435 \u044d\u0442\u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d         print(\"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441\u0442\u0430\u0442\u044c\u0438:\", article.title)<\/code><\/pre>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u0430&nbsp;<code>Optional<\/code>&nbsp;\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 mypy \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0434\u0438\u0442\u044c \u043d\u0430\u0441, \u0435\u0441\u043b\u0438 \u043c\u044b \u0432\u0434\u0440\u0443\u0433 \u0437\u0430\u0431\u0443\u0434\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439&nbsp;<code>None<\/code>, \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0434\u043e\u0441\u0430\u0434\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 (\u0441\u043c.&nbsp;<a href=\"https:\/\/www.infoq.com\/presentations\/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare\/\" rel=\"noopener noreferrer nofollow\">\u041e\u0448\u0438\u0431\u043a\u0430 \u043d\u0430 \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434 \u0434\u043e\u043b\u043b\u0430\u0440\u043e\u0432<\/a>).<\/p>\n<p><a class=\"anchor\" name=\"%D1%81%D0%BE%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC-%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80-%D0%B8%D0%B7-%D1%82%D0%B8%D0%BF%D0%BE%D0%B2\" id=\"\u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c-\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440-\u0438\u0437-\u0442\u0438\u043f\u043e\u0432\"><\/a><\/p>\n<h3>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438\u0437 \u0442\u0438\u043f\u043e\u0432<\/h3>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435&nbsp;<em>\u0442\u0438\u043f\u043e\u0432-\u0441\u0443\u043c\u043c<\/em>&nbsp;\u0438&nbsp;<em>\u0442\u0438\u043f\u043e\u0432-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0439<\/em>&nbsp;\u043f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a&nbsp;<em>\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440<\/em>&nbsp;(\u0435\u0449\u0451 \u0440\u0430\u0437 \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u043d\u0430 \u043e\u0431\u043b\u043e\u0436\u043a\u0435 \u0441\u0442\u0430\u0442\u044c\u0438). \u041c\u044b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0438 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u043c \u043e\u0434\u043d\u0438 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0440\u0443\u0433\u0438\u0435, \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d, \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u043d\u044b\u0439 \u043a \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043f\u0440\u0438\u043c\u0435\u0440. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 <em>\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438<\/em> \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code class=\"python\">from dataclasses import dataclass from typing import Union  @dataclass(frozen=True) class SignInWithEmail:     email: str     password: str  @dataclass(frozen=True) class SignInWithSms:     phone_number: str     code: str  @dataclass(frozen=True) class SignInWithSecretToken:     token: str  SignInMethod = Union[     SignInWithEmail,      SignInWithSms,      SignInWithSecretToken, ]<\/code><\/pre>\n<p>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u043d\u0430 \u043d\u0430\u0448 \u0441\u0430\u0439\u0442, \u0437\u043d\u0430\u044f&nbsp;<em>\u0430\u0434\u0440\u0435\u0441 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b \u0438 \u043f\u0430\u0440\u043e\u043b\u044c<\/em>&nbsp;<strong>\u0418\u041b\u0418<\/strong>&nbsp;\u043f\u043e\u043b\u0443\u0447\u0438\u0432&nbsp;<em>\u043a\u043e\u0434 \u0432 SMS<\/em>&nbsp;\u043d\u0430 \u043d\u043e\u043c\u0435\u0440 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430&nbsp;<strong>\u0418\u041b\u0418<\/strong>&nbsp;\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f&nbsp;<em>\u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d<\/em>. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445&nbsp;<code>SignInMethod<\/code>&nbsp;\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\"># \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 from typing import NoReturn  def assert_never(value: NoReturn) -&gt; NoReturn:     raise AssertionError(f\"\u041d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442: {value}\")  def sign_in(method: SignInMethod) -&gt; None:     if isinstance(method, SignInWithEmail):         print(\"\u0412\u0445\u043e\u0434 \u043d\u0430 \u0441\u0430\u0439\u0442 \u043f\u043e email \u0438 \u043f\u0430\u0440\u043e\u043b\u044e:\", method.email, method.password)     elif isinstance(method, SignInWithSms):         print(\"\u0412\u0445\u043e\u0434 \u043d\u0430 \u0441\u0430\u0439\u0442 \u0447\u0435\u0440\u0435\u0437 SMS-\u043a\u043e\u0434:\", method.phone_number, method.code)     elif isinstance(method, SignInWithSecretToken):         print(\"\u0412\u0445\u043e\u0434 \u043d\u0430 \u0441\u0430\u0439\u0442 \u0441 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u0442\u043e\u043a\u0435\u043d\u043e\u043c:\", method.token)     else:         assert_never(method)<\/code><\/pre>\n<p>\u0412 \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0442\u043a\u0435 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430&nbsp;<code>if<\/code>&nbsp;mypy \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u043d\u043e\u043c\u0435\u0440\u0443 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430&nbsp;<code>phone_number<\/code>&nbsp;\u0438\u0437 \u0432\u0435\u0442\u043a\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 \u0432\u0445\u043e\u0434\u0430 \u043f\u043e \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u0435 \u0438 \u043f\u0430\u0440\u043e\u043b\u044e. \u0424\u0443\u043d\u043a\u0446\u0438\u044f&nbsp;<code>assert_never<\/code>&nbsp;\u2014 \u044d\u0442\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439&nbsp;<a href=\"https:\/\/github.com\/python\/typing\/issues\/735\" rel=\"noopener noreferrer nofollow\">\u0442\u0440\u044e\u043a<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 mypy \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u044b&nbsp;<em>\u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b<\/em>&nbsp;\u0442\u0438\u043f\u0430-\u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f (exhaustiveness checking). \u0415\u0441\u043b\u0438 \u043c\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430&nbsp;<code>SignInMethod<\/code>, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0432\u0445\u043e\u0434 \u043f\u043e \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u0447\u0438\u0441\u043b\u0443 (<em>\u0438\u0434\u0435\u044f \u0442\u0430\u043a \u0441\u0435\u0431\u0435<\/em>), \u043d\u043e \u0437\u0430\u0431\u0443\u0434\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442:<\/p>\n<pre><code class=\"python\"># \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430  SignInMethod = Union[     SignInWithEmail,      SignInWithSms,      SignInWithSecretToken,      int, ]  def sign_in(method: SignInMethod) -&gt; None:     # \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439     ...<\/code><\/pre>\n<p>\u0422\u043e mypy \u0441\u043e\u043e\u0431\u0449\u0438\u0442 \u043d\u0430\u043c, \u0447\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043d\u0435 \u0443\u0447\u0442\u0451\u043d:<\/p>\n<pre><code>error: Argument 1 to \"assert_never\" has incompatible type \"int\"; expected \"NoReturn\"    assert_never(method)<\/code><\/pre>\n<p><a class=\"anchor\" name=\"%D1%81%D0%BE%D0%BF%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81-%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D1%86%D0%BE%D0%BC\" id=\"\u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435-\u0441-\u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c\"><\/a><\/p>\n<h4>\u0421\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c<\/h4>\n<p>\u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c&nbsp;<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A1%D0%BE%D0%BF%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D1%86%D0%BE%D0%BC\" rel=\"noopener noreferrer nofollow\">\u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c<\/a>&nbsp;(pattern matching), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0410 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 mypy \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0438\u043f\u043e\u0432 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0442\u0438\u043f\u0430-\u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u044f\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 3.10 \u0438 \u0432 Python \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430&nbsp;<em>\u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c<\/em>&nbsp;(\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432&nbsp;<a href=\"https:\/\/www.python.org\/dev\/peps\/pep-0622\/#exhaustiveness-checks\" rel=\"noopener noreferrer nofollow\">PEP-622<\/a>). \u041a\u043e\u0434 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432 Python 3.10 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\"># Python 3.10 # \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430  def sign_in(method: SignInMethod) -&gt; None:     match method:         case SignInWithEmail(email=email, password=passw):             print(\"\u0412\u0445\u043e\u0434 \u043d\u0430 \u0441\u0430\u0439\u0442 \u043f\u043e email \u0438 \u043f\u0430\u0440\u043e\u043b\u044e:\", email, passw)         case SignInWithSms(phone_number=pn, code=code):             print(\"\u0412\u0445\u043e\u0434 \u043d\u0430 \u0441\u0430\u0439\u0442 \u0447\u0435\u0440\u0435\u0437 SMS-\u043a\u043e\u0434:\", pn, code)         case SignInWithSecretToken(token=token):             print(\"\u0412\u0445\u043e\u0434 \u043d\u0430 \u0441\u0430\u0439\u0442 \u0441 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u0442\u043e\u043a\u0435\u043d\u043e\u043c:\", token)  # \u0412\u044b\u0432\u0435\u0434\u0435\u0442: \u0412\u0445\u043e\u0434 \u043d\u0430 \u0441\u0430\u0439\u0442 \u043f\u043e email \u0438 \u043f\u0430\u0440\u043e\u043b\u044e: email@example.org password123 sign_in(SignInWithEmail(\"email@example.org\", \"password123\"))  # \u0412\u044b\u0432\u0435\u0434\u0435\u0442: \u0412\u0445\u043e\u0434 \u043d\u0430 \u0441\u0430\u0439\u0442 \u0447\u0435\u0440\u0435\u0437 SMS-\u043a\u043e\u0434: 79001234567 abcd sign_in(SignInWithSms(\"79001234567\", \"abcd\"))  # \u0412\u044b\u0432\u0435\u0434\u0435\u0442: \u0412\u0445\u043e\u0434 \u043d\u0430 \u0441\u0430\u0439\u0442 \u0441 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u0442\u043e\u043a\u0435\u043d\u043e\u043c: secret-token sign_in(SignInWithSecretToken(\"secret-token\"))<\/code><\/pre>\n<p><em>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435. \u041d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 mypy 0.910 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c, \u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u043d\u0430\u0434 \u044d\u0442\u0438\u043c \u0443\u0436\u0435&nbsp;<\/em><a href=\"https:\/\/github.com\/python\/mypy\/pull\/10191\" rel=\"noopener noreferrer nofollow\"><em>\u0438\u0434\u0451\u0442<\/em><\/a><em>.<\/em><\/p>\n<p><a class=\"anchor\" name=\"%D0%B2-%D1%87%D1%91%D0%BC-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%B0\" id=\"\u0432-\u0447\u0451\u043c-\u043f\u043e\u043b\u044c\u0437\u0430\"><\/a><\/p>\n<h3>\u0412 \u0447\u0451\u043c \u043f\u043e\u043b\u044c\u0437\u0430?<\/h3>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0443 \u0441\u0430\u043c\u043e\u0439 \u0438\u0434\u0435\u0438,&nbsp;<em>\u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/em>&nbsp;\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043c\u043e\u0449\u043d\u044b\u043c \u0438 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0418\u0442\u0430\u043a, \u043a\u0430\u043a\u0438\u0435 \u0436\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0435\u0441\u0442\u044c \u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c? \u041c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0436\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435&nbsp;<em>\u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>&nbsp;\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0431\u043e\u043b\u0435\u0435 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u0438 \u043f\u0440\u043e\u0441\u0442\u043e.&nbsp;<em>\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<\/em>&nbsp;\u2014 \u044d\u0442\u043e&nbsp;(<em>\u0438\u043c\u044f<\/em>&nbsp;<strong>\u0418<\/strong>&nbsp;<em>\u0444\u0430\u043c\u0438\u043b\u0438\u044f)<\/em>&nbsp;<strong>\u0418\u041b\u0418<\/strong>&nbsp;(<em>\u0444\u0430\u043c\u0438\u043b\u0438\u044f<\/em>&nbsp;<strong>\u0418<\/strong>&nbsp;<em>\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u044b)<\/em>.&nbsp;<em>\u041f\u0440\u043e\u0434\u0443\u043a\u0442<\/em>&nbsp;\u0432 \u043a\u043d\u0438\u0436\u043d\u043e\u043c \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0435 \u2014 \u044d\u0442\u043e&nbsp;<em>\u043a\u043d\u0438\u0433\u0430<\/em>&nbsp;<strong>\u0418\u041b\u0418<\/strong>&nbsp;<em>\u0433\u0430\u0437\u0435\u0442\u0430<\/em>&nbsp;<strong>\u0418\u041b\u0418<\/strong>&nbsp;<em>\u0441\u0443\u0432\u0435\u043d\u0438\u0440<\/em>. \u0418 \u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435.<\/p>\n<\/li>\n<li>\n<p><em>\u0422\u0438\u043f-\u0441\u0443\u043c\u043c\u0430<\/em>&nbsp;\u0447\u0430\u0441\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043e\u0439&nbsp;<em>\u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/em>&nbsp;\u0432 \u041e\u041e\u041f. \u041d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043e\u0431\u0449\u0438\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432. \u041d\u0435 \u043d\u0443\u0436\u043d\u044b&nbsp;<em>\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b<\/em>&nbsp;\u0438 \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f (\u0441\u043c. \u043f\u0430\u0442\u0442\u0435\u0440\u043d&nbsp;<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D0%BE%D1%81%D0%B5%D1%82%D0%B8%D1%82%D0%B5%D0%BB%D1%8C_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0441\u0435\u0442\u0438\u0442\u0435\u043b\u044c<\/a>).&nbsp;<em>\u0414\u0430\u043d\u043d\u044b\u0435<\/em>&nbsp;\u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f, \u0430 mypy \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <em>\u0434\u0430\u043d\u043d\u044b\u0445<\/em> \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f&nbsp;<em>\u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/em>, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c&nbsp;<em>\u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043d\u0435\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c\u044b\u043c\u0438<\/em>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0438\u043f-\u0434\u0430\u043d\u043d\u044b\u0445&nbsp;<code>SignInMethod<\/code>&nbsp;\u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\">from dataclasses import dataclass from typing import Optional  @dataclass(frozen=True) class SignInMethod:     email: Optional[str] = None     password: Optional[str] = None     phone_number: Optional[str] = None     code: Optional[str] = None     token: Optional[str] = None  sign_in_with_email = SignInMethod(     email=\"email@example.org\",      password=\"password123\", )  sign_in_with_token = SignInMethod(token=\"secret-token\") ...<\/code><\/pre>\n<p>\u0427\u0435\u043c \u044d\u0442\u043e \u0445\u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u0430-\u0441\u0443\u043c\u043c\u044b? \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043b\u043e\u0445 \u0442\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443\u0430\u043b\u044c\u043d\u043e&nbsp;<em>\u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0435<\/em>&nbsp;\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435&nbsp;<code>SignInMethod()<\/code>, \u0432\u0441\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0443\u0442&nbsp;<code>None<\/code>. \u041d\u0430\u0448 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0436\u0435 \u0442\u0438\u043f&nbsp;<code>Union[SignInWithEmail, SignInWithSms, SignInWithSecretToken]<\/code>, \u043c\u044b \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0440\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u0434\u0435\u043b\u0430\u0435\u043c&nbsp;<em>\u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043d\u0435\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c\u044b\u043c\u0438<\/em>&nbsp;\u0432 \u043d\u0430\u0448\u0438\u0445 \u0442\u0438\u043f\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8-%D0%BF%D0%BE-%D1%82%D0%B5%D0%BC%D0%B5\" id=\"\u0441\u0441\u044b\u043b\u043a\u0438-\u043f\u043e-\u0442\u0435\u043c\u0435\"><\/a><\/p>\n<h3>\u0421\u0441\u044b\u043b\u043a\u0438 \u043f\u043e \u0442\u0435\u043c\u0435<\/h3>\n<ul>\n<li>\n<p><a href=\"https:\/\/docs.python.org\/3\/reference\/datamodel.html#the-standard-type-hierarchy\" rel=\"noopener noreferrer nofollow\">\u0418\u0435\u0440\u0430\u0440\u0445\u0438\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0432 Python<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/mypy-lang.org\" rel=\"noopener noreferrer nofollow\">mypy<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=Up7LcbGZFuo\" rel=\"noopener noreferrer nofollow\">Domain Modeling Made Functional &#8212; Scott Wlaschin<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/podlodka.io\/71\" rel=\"noopener noreferrer nofollow\">Podlodka #71 &#8212; \u0410\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/hakibenita.com\/python-mypy-exhaustive-checking\" rel=\"noopener noreferrer nofollow\">Exhaustiveness Checking with Mypy<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"http:\/\/blog.ezyang.com\/2020\/10\/idiomatic-algebraic-data-types-in-python-with-dataclasses-and-union\/\" rel=\"noopener noreferrer nofollow\">Idiomatic algebraic data types in Python with dataclasses and Union<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/566920\/\"> https:\/\/habr.com\/ru\/post\/566920\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043a\u0442\u043e-\u0442\u043e \u0438\u0437 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439, \u0443\u0432\u0438\u0434\u0435\u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u043f\u043e\u0434\u0443\u043c\u0430\u0435\u0442 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0432\u0440\u043e\u0434\u0435:<\/p>\n<p><em>&#171;\u0427\u0442\u043e?! \u0410\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445?! \u042d\u0442\u043e \u0436\u0435 \u0447\u0442\u043e-\u0442\u043e \u0438\u0437 \u043c\u0438\u0440\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. Python?! \u041d\u0443 \u043d\u0435\u0442&#8230; \u0413\u0434\u0435 Python \u0441\u043e \u0441\u0432\u043e\u0435\u0439 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0443\u0442\u0438\u043d\u043e\u0439 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0435\u0439,&nbsp;\u0430 \u0433\u0434\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0443\u0436 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0435&#8230;&#187;<\/em><\/p>\n<p>\u0427\u0442\u043e-\u0442\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0434\u0443\u0445\u0435. \u041d\u043e, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0432 Python \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u044f&nbsp;<a href=\"https:\/\/docs.python.org\/3\/reference\/datamodel.html#the-standard-type-hierarchy\" rel=\"noopener noreferrer nofollow\">\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0438\u043f\u043e\u0432<\/a>, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e Python \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u044f\u0437\u044b\u043a\u043e\u043c \u0441\u043e&nbsp;<em>\u0441\u0442\u0440\u043e\u0433\u043e\u0439 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0435\u0439<\/em>, \u0430 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f&nbsp;<a href=\"http:\/\/www.mypy-lang.org\/\" rel=\"noopener noreferrer nofollow\">mypy<\/a>&nbsp;\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0431\u0435\u0437 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041f\u043e\u043c\u0438\u043c\u043e \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439, \u0432 Python \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0441&nbsp;<em>\u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>. \u0422\u0430\u043a \u0447\u0442\u043e \u0436\u0435 \u044d\u0442\u043e \u0437\u0430 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u0430\u043a \u043e\u043d\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0432 Python, \u0438 \u043a\u0430\u043a\u0443\u044e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u043e\u043b\u044c\u0437\u0443 \u043f\u0440\u0438\u043d\u043e\u0441\u044f\u0442 \u2014 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h3>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/h3>\n<ul>\n<li>\n<p><a href=\"#%D0%BD%D0%B5%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B5-%D0%B2%D1%81%D1%82%D1%83%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0432\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#1-%D0%B8-0\" rel=\"noopener noreferrer nofollow\">1 \u0438 0<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D1%82%D0%B8%D0%BF-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0422\u0438\u043f-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D1%82%D0%B8%D0%BF-%D1%81%D1%83%D0%BC%D0%BC%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0422\u0438\u043f-\u0441\u0443\u043c\u043c\u0430<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#optional-%D0%B8%D0%BB%D0%B8-%D0%BE%D1%82%D1%81%D1%83%D1%82%D1%81%D1%82%D0%B2%D0%B8%D0%B5-%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">Optional \u0438\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#%D1%81%D0%BE%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D0%BC-%D0%BA%D0%BE%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80-%D0%B8%D0%B7-%D1%82%D0%B8%D0%BF%D0%BE%D0%B2\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438\u0437 \u0442\u0438\u043f\u043e\u0432<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#%D1%81%D0%BE%D0%BF%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81-%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D1%86%D0%BE%D0%BC\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#%D0%B2-%D1%87%D1%91%D0%BC-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0412 \u0447\u0451\u043c \u043f\u043e\u043b\u044c\u0437\u0430?<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8-%D0%BF%D0%BE-%D1%82%D0%B5%D0%BC%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0421\u0441\u044b\u043b\u043a\u0438 \u043f\u043e \u0442\u0435\u043c\u0435<\/a><\/p>\n<\/li>\n<\/ul>\n<p><em>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435. \u0414\u0430\u043b\u0435\u0435 \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 Python 3.9 \u0438 3.10, \u0430 \u0442\u0430\u043a\u0436\u0435&nbsp;<\/em><a href=\"http:\/\/www.mypy-lang.org\/\" rel=\"noopener noreferrer nofollow\"><em>mypy<\/em><\/a><em>&nbsp;\u0432\u0435\u0440\u0441\u0438\u0438 0.910 (\u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438&nbsp;<\/em><a href=\"https:\/\/pastebin.com\/DRnwcW6X\" rel=\"noopener noreferrer nofollow\"><em>\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438<\/em><\/a><em>) \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u0442\u0438\u043f\u043e\u0432.<\/em><\/p>\n<p><a class=\"anchor\" name=\"%D0%BD%D0%B5%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B5-%D0%B2%D1%81%D1%82%D1%83%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5\" id=\"\u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435-\u0432\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435\">\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435&#187;<\/a><\/p>\n<h3>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0432\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0421\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0435\u0441\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u0432\u0438\u0434\u0435, \u0442\u043e \u0432\u044b \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435&nbsp;<em>\u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/em>, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0435 \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u044f \u043e\u0431 \u044d\u0442\u043e\u043c.&nbsp; \u041f\u043e\u0434 \u044d\u0442\u0438\u043c&nbsp;\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u043a\u0430\u0434\u0435\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u043e\u043d\u044f\u0442\u0438\u0435\u043c \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0438\u0434\u0435\u044f&nbsp;<em>\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438<\/em>&nbsp;\u2014 \u043a\u0430\u043a \u0438\u0437 \u043e\u0434\u043d\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435, \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 (\u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u044d\u0442\u0443 \u0438\u0434\u0435\u044e&nbsp;<em>\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438<\/em>&nbsp;\u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043d\u0430\u043c\u0435\u043a\u0430\u0435\u0442 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u043d\u0430 \u043e\u0431\u043b\u043e\u0436\u043a\u0435 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438). \u0418\u0442\u0430\u043a,&nbsp;<em>\u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445<\/em>&nbsp;\u2014 \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f&nbsp;<em>\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439<\/em>&nbsp;\u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432. \u0412\u043e\u0442 \u0442\u0430\u043a\u043e\u0435 \u043d\u0435\u0437\u0430\u0442\u0435\u0439\u043b\u0438\u0432\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435.&nbsp;<em>\u0410\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0435<\/em>&nbsp;\u0436\u0435 \u044d\u0442\u0438 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e \u0444\u0430\u043a\u0442\u0430, \u0447\u0442\u043e \u043d\u043e\u0432\u044b\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u0432 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0430\u043b\u0433\u0435\u0431\u0440\u0430\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f. \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0437 \u0441\u0435\u0431\u044f \u0441\u0443\u043c\u043c\u0430 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435&nbsp;<em>\u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445<\/em>&nbsp;\u0432\u043e\u043e\u0431\u0449\u0435.<\/p>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u0443\u043c\u0430\u0442\u044c \u043e&nbsp;<em>\u0442\u0438\u043f\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>&nbsp;\u2014 \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0442\u0438\u043f \u043a\u0430\u043a&nbsp;<em>\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0432\u0441\u0435\u0445 \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<\/em>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0438\u043f&nbsp;<code>bool<\/code>&nbsp;\u2014 \u044d\u0442\u043e \u0434\u0432\u0443\u0445\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043d\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b&nbsp;<code>True<\/code>&nbsp;\u0438&nbsp;<code>False<\/code>. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439&nbsp;<em>\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u044b\u0439 \u0442\u0438\u043f<\/em>&nbsp;<code>Color<\/code>:<\/p>\n<pre><code class=\"python\">from enum import Enum  class Color(Enum):     Red = \"r\"     Green = \"g\"     Blue = \"b\"<\/code><\/pre>\n<p>\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 3 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. \u0422\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445&nbsp;<code>int<\/code>&nbsp;\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0432\u0441\u0435\u0445 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b. \u0410 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445&nbsp;<code>str<\/code>&nbsp;\u2014 \u044d\u0442\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e, \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430, \u0441\u0442\u0440\u043e\u043a\u0438&nbsp;<code>\"\u043f\u0440\u0438\u0432\u0435\u0442\"<\/code>&nbsp;\u0438&nbsp;<code>\"hello\"<\/code>, \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0432\u0430\u0448\u0435\u0439 \u043b\u044e\u0431\u0438\u043c\u043e\u0439 \u043f\u0435\u0441\u043d\u0438, \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0412 \u043e\u0431\u0449\u0435\u043c, \u043a\u0430\u043a \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445&nbsp;<code>str<\/code>&nbsp;\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442&nbsp;<em>\u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e<\/em>&nbsp;\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p><a class=\"anchor\" name=\"1-%D0%B8-0\" id=\"1-\u0438-0\">><\/a><\/p>\n<h3>1 \u0438 0<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u0443\u043c\u0430\u0442\u044c \u043e \u043a\u0430\u043a\u043e\u043c-\u0442\u043e&nbsp;<em>\u0442\u0438\u043f\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>&nbsp;\u043a\u0430\u043a \u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0442\u043e \u0447\u0442\u043e \u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f&nbsp;<em>\u043e\u0434\u043d\u043e\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043d\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e<\/em>, \u0438\u043b\u0438 \u0432\u043e\u0432\u0441\u0435&nbsp;<em>\u043f\u0443\u0441\u0442\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e<\/em>? \u0412 Python \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043c\u0435\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,&nbsp;<code>None<\/code>&nbsp;\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u0438\u043f\u0430&nbsp;<code>NoneType<\/code>. \u0412 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u0445 \u0442\u0438\u043f\u043e\u0432 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e \u0444\u0430\u043a\u0442\u0430, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 (\u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f&nbsp;<em>\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043e\u0439<\/em>, \u0430 \u043d\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439):<\/p>\n<pre><code class=\"python\">def do_something_interesting(value: int) -&gt; None:     ...<\/code><\/pre>\n<p>\u0414\u0440\u0443\u0433\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0439 \u043a\u043e\u0440\u0442\u0435\u0436 (tuple):<\/p>\n<pre><code class=\"python\">from typing import Tuple  empty: Tuple[()] = ()<\/code><\/pre>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435&nbsp;<code>()<\/code>&nbsp;\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0432\u0441\u0435\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430&nbsp;<code>Tuple[()]<\/code>. \u0415\u0441\u0442\u044c \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u043d\u043e \u043e\u0431\u0449\u0438\u0439 \u0441\u043c\u044b\u0441\u043b, \u0434\u0443\u043c\u0430\u044e, \u043f\u043e\u043d\u044f\u0442\u0435\u043d. \u041f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f&nbsp;<em>\u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/em>. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0435\u0441\u0442\u0438 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u043e\u043b\u044c\u0437\u0443. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"python\">from enum import Enum from typing import Union  class Default(Enum):     Value = 0  def process(value: Union[int, None, Default] = Default.Value) -&gt; int:     if value is Default.Value:         return 0     elif value is None:         return 1     else:         # \u0412 \u044d\u0442\u043e\u0439 \u0432\u0435\u0442\u043a\u0435 mypy \"\u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\", \u0447\u0442\u043e value \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f int,          # \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0430         return value * 2<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430,&nbsp;<code>None<\/code>&nbsp;\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u0430&nbsp;<code>Default<\/code>&nbsp;\u0438 \u0435\u0433\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f&nbsp;<code>Default.Value<\/code>&nbsp;\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u044b\u0437\u0432\u0430\u043d\u0430 \u0431\u0435\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432&nbsp;<code>process()<\/code>, \u043e\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430&nbsp;<code>None<\/code>&nbsp;\u044f\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438&nbsp;<code>process(None)<\/code>, \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0432\u0435\u0442\u043a\u0443 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430&nbsp;<code>if<\/code>.<\/p>\n<p>\u041e\u0442\u043b\u0438\u0447\u043d\u043e, \u043d\u043e \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u0442\u0438\u043f\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430\u043c. \u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438&nbsp;<em>\u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c\u044b \u0432 \u0432\u0438\u0434\u0435 \u043e\u0434\u043d\u043e\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u0443\u0441\u0442\u044b\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c. \u0422\u0430\u043a \u0437\u0430\u0447\u0435\u043c \u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0443\u0436\u0435\u043d \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442? \u041f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442&nbsp;<em>\u043d\u0435\u043d\u0430\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u043c<\/em>&nbsp;(uninhabited type), \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0435\u0432\u044b\u0447\u0438\u0441\u043b\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u0440\u043e\u0448\u0435\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b, \u0438 \u0442.\u043f. \u0412 Python \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0442\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code class=\"python\">from typing import NoReturn  def stop() -&gt; NoReturn:     raise RuntimeError(\"\u041d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f!\")<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0436\u0435 \u043c\u044b \u0447\u0442\u043e-\u0442\u043e \u043d\u0430\u043f\u0443\u0442\u0430\u0435\u043c \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0437 \u0442\u0430\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"python\">from typing import NoReturn  def stop(value: int) -&gt; NoReturn:     if value &lt; 0:         return 42     raise RuntimeError(\"\u041d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f!\")<\/code><\/pre>\n<p>\u0442\u043e, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0432 mypy, \u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u0443\u0432\u0438\u0434\u0438\u043c \u043e\u0448\u0438\u0431\u043a\u0443:<\/p>\n<pre><code>error: Return statement in function which does not return     return 42<\/code><\/pre>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0435\u0441\u043b\u0438 \u0442\u0438\u043f \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d&nbsp;<code>NoReturn<\/code>, \u0442\u043e \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u044d\u0442\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043d\u0438 \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0442\u0430\u043a \u043a\u0430\u043a&nbsp;<code>NoReturn<\/code>&nbsp;\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f&nbsp;<em>\u043d\u0435\u043d\u0430\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u043c<\/em>&nbsp;\u0442\u0438\u043f\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u0438, \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442:<\/p>\n<pre><code class=\"python\">from typing import NoReturn  value: NoReturn = None other_value: NoReturn = ()<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u0442\u0438\u043f\u043e\u0432 mypy \u0441\u043e\u043e\u0431\u0449\u0438\u0442 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435:<\/p>\n<pre><code>error: Incompatible types in assignment (expression has type \"None\", variable has type \"NoReturn\")     value = None  error: Incompatible types in assignment (expression has type \"Tuple[]\", variable has type \"NoReturn\")     other_value: NoReturn = ()<\/code><\/pre>\n<p><a class=\"anchor\" name=\"%D1%82%D0%B8%D0%BF-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5\" id=\"\u0442\u0438\u043f-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435\">\u0432\u0435\u0434\u0435\u043d\u0438\u0435&#187;<\/a><\/p>\n<h3>\u0422\u0438\u043f-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0421\u043b\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0435\u0437 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438&nbsp;<em>\u0442\u0438\u043f\u043e\u0432-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0439<\/em>&nbsp;(product type). \u042d\u0442\u043e, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0432 \u0438\u0445 \u0432\u043c\u0435\u0441\u0442\u0435. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0438\u043f\u0430-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u2014 \u043a\u043e\u0440\u0442\u0435\u0436 \u0438\u0437 \u0434\u0432\u0443\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0438\u043b\u0438&nbsp;<em>\u043f\u0430\u0440\u0430<\/em>:<\/p>\n<pre><code class=\"python\">from enum import Enum from typing import Tuple  class ChessPieceType(Enum):     \"\"\"\u0422\u0438\u043f \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u044b.\"\"\"     King = \"\u041a\u043e\u0440\u043e\u043b\u044c\"     Queen = \"\u0424\u0435\u0440\u0437\u044c\"     Rook = \"\u041b\u0430\u0434\u044c\u044f\"     Bishop = \"\u0421\u043b\u043e\u043d\"     Knight = \"\u041a\u043e\u043d\u044c\"     Pawn = \"\u041f\u0435\u0448\u043a\u0430\"  class ChessPieceColor(Enum):     \"\"\"\u0426\u0432\u0435\u0442 \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u044b.\"\"\"     White = \"\u0411\u0435\u043b\u044b\u0439\"     Black = \"\u0427\u0435\u0440\u043d\u044b\u0439\"  ChessPiece = Tuple[ChessPieceType, ChessPieceColor]  # \u0411\u0435\u043b\u044b\u0439 \u043a\u043e\u0440\u043e\u043b\u044c white_king: ChessPiece = (ChessPieceType.King, ChessPieceColor.White) # \u0427\u0435\u0440\u043d\u044b\u0439 \u0444\u0435\u0440\u0437\u044c black_queen: ChessPiece = (ChessPieceType.Queen, ChessPieceColor.Black)<\/code><\/pre>\n<p>\u0412 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0435&nbsp;<code>ChessPiece<\/code>&nbsp;\u2014 \u044d\u0442\u043e \u0442\u0438\u043f-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435&nbsp;<em>\u043f\u0430\u0440\u0430<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439 \u0434\u0432\u0443\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432: \u0442\u0438\u043f\u0430 \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u044b&nbsp;<code>ChessPieceType<\/code>&nbsp;\u0438 \u0446\u0432\u0435\u0442\u0430&nbsp;<code>ChessPieceColor<\/code>. \u0423\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f&nbsp;<em>\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c<\/em>. \u0422\u0438\u043f&nbsp;<code>ChessPieceType<\/code>&nbsp;\u0438\u043c\u0435\u0435\u0442 6 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0430 \u0442\u0438\u043f&nbsp;<code>ChessPieceColor<\/code>&nbsp;\u0438\u043c\u0435\u0435\u0442 2 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430&nbsp;<code>ChessPiece<\/code>&nbsp;\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f&nbsp;<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D1%8F%D0%BC%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0434\u0435\u043a\u0430\u0440\u0442\u043e\u0432\u044b\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c<\/a>&nbsp;\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0434\u0432\u0443\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432, \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 12 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u0430\u044f \u0444\u0438\u0433\u0443\u0440\u0430&nbsp;<code>ChessPiece<\/code>&nbsp;\u2014 \u044d\u0442\u043e \u0442\u0438\u043f \u0444\u0438\u0433\u0443\u0440\u044b&nbsp;<code>ChessPieceType<\/code>&nbsp;<strong>\u0418<\/strong>&nbsp;\u0446\u0432\u0435\u0442 \u0444\u0438\u0433\u0443\u0440\u044b&nbsp;<code>ChessPieceColor<\/code>. \u041c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0435 \u043a\u0430\u043a\u0438\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0448\u0430\u0445\u043c\u0430\u0442\u043d\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u044b \u043d\u0430\u0448\u0435\u043c\u0443 \u0442\u0438\u043f\u0443-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430 \u0434\u043e\u0441\u043a\u0435&nbsp;<code>PositionOnBoard<\/code>:<\/p>\n<pre><code class=\"python\"># \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430  # \u0428\u0430\u0445\u043c\u0430\u0442\u043d\u0430\u044f \u0444\u0438\u0433\u0443\u0440\u0430 \u2014 \u044d\u0442\u043e \u0442\u0438\u043f \u0444\u0438\u0433\u0443\u0440\u044b  #   \u0418 \u0446\u0432\u0435\u0442 \u0444\u0438\u0433\u0443\u0440\u044b  #   \u0418 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0444\u0438\u0433\u0443\u0440\u044b \u043d\u0430 \u0434\u043e\u0441\u043a\u0435 ChessPiece = Tuple[ChessPieceType, ChessPieceColor, PositionOnBoard]<\/code><\/pre>\n<p>\u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430&nbsp;<code>ChessPiece<\/code>&nbsp;\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u0441\u044f \u0434\u043e 768 (6 \u0442\u0438\u043f\u043e\u0432&nbsp;<strong>x<\/strong>&nbsp;2 \u0446\u0432\u0435\u0442\u0430&nbsp;<strong>x<\/strong>&nbsp;64 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438).<\/p>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u043a\u043e\u0440\u0442\u0435\u0436\u0435\u0439, \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0442\u0438\u043f\u0430\u043c-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b (struct), \u043a\u043b\u0430\u0441\u0441\u044b \u043e\u0431\u0440\u0430\u0437\u0446\u044b (case class), \u0437\u0430\u043f\u0438\u0441\u0438 (record), \u0438 \u0442.\u043f. \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0438\u043f-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 Python \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u0430&nbsp;<em>dataclass<\/em>&nbsp;\u0438\u0437 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e&nbsp;<a href=\"https:\/\/docs.python.org\/3\/library\/dataclasses.html\" rel=\"noopener noreferrer nofollow\">\u043c\u043e\u0434\u0443\u043b\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438<\/a>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0442\u0438\u043f:<\/p>\n<pre><code class=\"python\">from dataclasses import dataclass from enum import Enum  class Role(Enum):     Administrator = 0     Editor = 1     Reader = 2  @dataclass(frozen=True) class User:     name: str     role: Role     is_active: bool<\/code><\/pre>\n<p>\u0422\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445&nbsp;<code>User<\/code>&nbsp;\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439 \u0442\u0438\u043f\u043e\u0432&nbsp;<code>str<\/code>,&nbsp;<code>Role<\/code>&nbsp;\u0438&nbsp;<code>bool<\/code>. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c&nbsp;<code>User<\/code>&nbsp;\u2014 \u044d\u0442\u043e \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f&nbsp;<code>str<\/code>&nbsp;<strong>\u0418<\/strong>&nbsp;\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f&nbsp;<code>Role<\/code>&nbsp;<strong>\u0418<\/strong>&nbsp;\u0444\u043b\u0430\u0433 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438&nbsp;<code>bool<\/code>.<\/p>\n<p>\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0439 mypy \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043e\u0442\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u043e\u043b\u044e:<\/p>\n<pre><code class=\"python\"># \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430  def get_user_info(user: User) -&gt; str:     # \u0410\u0432\u0442\u043e\u0440\u0443 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u043e 42      # \u043a \u0438\u043c\u0435\u043d\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f...     name = user.name + 42     return f\"{name}: {user.role.name} {user.is_active}\"<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, mypy \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043d\u0430\u0441 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0432 \u0442\u0430\u043a\u043e\u043c \u043a\u043e\u0434\u0435:<\/p>\n<pre><code>error: Unsupported operand types for + (\"str\" and \"int\")     name = user.name + 42<\/code><\/pre>\n<p>\u041d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435&nbsp;<em>\u043d\u0435\u043d\u0430\u0441\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438, \u043f\u0440\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0442\u0438\u043f\u0430-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"python\">from dataclasses import dataclass from typing import NoReturn  @dataclass(frozen=True) class Ooops:     number: int     string: str     nothing: NoReturn<\/code><\/pre>\n<p>\u0421\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0443 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445? \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430&nbsp;<code>int<\/code>&nbsp;<strong>x<\/strong>&nbsp;\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430&nbsp;<code>str<\/code>&nbsp;<strong>x<\/strong>&nbsp;0 (\u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430&nbsp;<code>NoReturn<\/code>). \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0443 \u0442\u0438\u043f\u0430&nbsp;<code>Ooops<\/code>&nbsp;\u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0438 \u0442\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u0442\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0435\u0442&nbsp;<em>\u043d\u0435\u043d\u0430\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u043c<\/em>. \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043a\u0430\u043a-\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430:<\/p>\n<pre><code class=\"python\"># \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430  Ooops(42, \"hello\", None)<\/code><\/pre>\n<p>\u0422<\/p>\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-326207","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/326207","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=326207"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/326207\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=326207"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=326207"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=326207"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}