{"id":332568,"date":"2022-04-28T21:00:44","date_gmt":"2022-04-28T21:00:44","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=332568"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=332568","title":{"rendered":"<span>\u0421\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u044f argparse \u043f\u0440\u0435\u043f\u0430\u0440\u0438\u0440\u043e\u0432\u0430\u043b<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442.\u00a0\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u043c\u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0440\u0430\u0442\u044c N\u00a0\u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432\u00a0\u0432 \u043e\u0434\u0438\u043d. \u0412 \u043d\u0435\u043c\u00a0\u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c\u00a0\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u0438\u00a0N\u00a0\u0434\u0435\u0442\u0435\u0439, \u0430 \u0442\u0430\u043a\u0436\u0435\u00a0\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438\u00a0\u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u0435\u0445\u00a0\u043f\u043e\u0434\u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432.<\/p>\n<p>\u0421\u043f\u043e\u0439\u043b\u0435\u0440: \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e! \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u044e, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u043c\u043e\u0434\u0443\u043b\u044c argparse \u0432 Python 3 \u0438 \u0447\u0442\u043e \u043e\u043d \u0443\u043c\u0435\u0435\u0442.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2a7\/4fb\/393\/2a74fb3933e3fba432705f15b8dc2794.png\" width=\"2000\" height=\"1125\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2a7\/4fb\/393\/2a74fb3933e3fba432705f15b8dc2794.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0430\u0440\u0441\u0435\u0440 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c. \u0418 \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u0442\u0435 Python \u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0441\u043e\u043a\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435, \u043f\u043e\u043d\u044f\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0442\u0443\u0442, \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e.<\/p>\n<h3>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u0434\u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u043b\u0443\u0447\u0448\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0443\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b,\u00a0\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0430\u043c\u044b\u0439 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0430\u0440\u0441\u0435\u0440\u0430,\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.\u00a0\u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u0437\u044f\u0442 \u0438\u0437 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439\u00a0\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"python\">import argparse parser = argparse.ArgumentParser(prog='PROG') parser.add_argument('--foo', action='store_true', help='foo help')  subparsers = parser.add_subparsers(help='sub-command help')  parser_a = subparsers.add_parser('a', help='a help') parser_a.add_argument('-a', help='bar help')  parser_b = subparsers.add_parser('b', help='b help') parser_b.add_argument('-b', help='baz help')  parser.parse_known_args(['a', '-a', '12', 'b', '-b', '32', '-d', '11']) > Namespace(a=12) ['b', '-b', '32', '-d', '11'] <\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0432 \u043a\u043e\u0434\u0435\u00a0\u2014\u00a0\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0441\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435: <\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><em>Sometimes a script may only parse a few of the command-line arguments, passing the remaining arguments on to another script or program. In these cases, the <\/em><code>parse_known_args()<\/code><em> method can be useful. It works much like <\/em><code>parse_args()<\/code><em> except that it does not produce an error when extra arguments are present. Instead, it returns a two item tuple containing the populated namespace and the list of remaining argument strings.<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\"><em>\u0418\u043d\u043e\u0433\u0434\u0430 \u0441\u043a\u0440\u0438\u043f\u0442 \u043c\u043e\u0436\u0435\u0442 \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0441\u043a\u0440\u0438\u043f\u0442\u0443 \u0438\u043b\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435. \u0412 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u043c\u0435\u0442\u043e\u0434 <\/em><code>parse_known_args()<\/code><em>. \u041e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a <\/em><code>parse_args()<\/code><em>, \u043d\u043e \u043d\u0435 \u0432\u044b\u0434\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u0440\u0442\u0435\u0436 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0447\u043b\u0435\u043d\u043e\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0435\u043d \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0440\u043e\u043a \u0441 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u043c\u0438\u0441\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438.<\/em><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0437\u0430 \u043e\u0434\u0438\u043d \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432 \u0431\u0435\u0437 \u0442\u0430\u043d\u0446\u0435\u0432 \u0441 \u0431\u0443\u0431\u043d\u0430\u043c\u0438. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0431\u043e\u043b\u0435\u0435 \u0441\u043a\u0440\u0443\u043f\u0443\u043b\u0435\u0437\u043d\u043e \u2014 \u0438 \u0432\u0441\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u044f\u0441\u043d\u043e.<\/p>\n<pre><code class=\"python\">import argparse parser = argparse.ArgumentParser(prog='PROG') # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \"\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439\" \u043f\u0430\u0440\u0441\u0435\u0440. parser.add_argument('--foo', action='store_true', help='foo help')  subparsers = parser.add_subparsers(help='sub-command help') # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432.  parser_a = subparsers.add_parser('a', help='a help') # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043f\u0430\u0440\u0441\u0435\u0440. parser_a.add_argument('-a', help='bar help')  parser_b = subparsers.add_parser('b', help='b help') # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043f\u0430\u0440\u0441\u0435\u0440. parser_b.add_argument('-b', help='baz help')  parser.parse_known_args(['a', '-a', '12', 'b', '-b', '32', '-d', '11']) # \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0411\u044b\u043b\u043e \u0431\u044b \u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043a\u043e\u0440\u0442\u0435\u0436, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432. \u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 - \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0438\u0436\u0435 \u043d\u0438\u0436\u0435. > Namespace(a=12) ['b', '-b', '32', '-d', '11'] # \u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 - \u043a\u043e\u0440\u0442\u0435\u0436, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 Namespace, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0445 \u0437\u0430 \u0441\u043f\u0430\u0440\u0448\u0435\u043d\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u043b\u0438\u0441\u0442, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u043b\u0438\u0448\u043d\u0438\u0435, \u043d\u0435\u0441\u043f\u0430\u0440\u0448\u0435\u043d\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. <\/code><\/pre>\n<h3>\u0418 \u0447\u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u0434\u0435\u043b\u0430\u0442\u044c?<\/h3>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430 \u043e\u0434\u0438\u043d \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438. \u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0432\u0430 \u0438\u0437 \u043d\u0438\u0445.\u00a0<\/p>\n<h4>\u0421\u043f\u043e\u0441\u043e\u0431 1<\/h4>\n<p>\u0418\u043c\u0435\u044f \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432, \u043c\u043e\u0436\u043d\u043e N \u0440\u0430\u0437 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>parse_known_args<\/code>, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 \u043b\u0438\u0448\u043d\u0438\u0445\u00a0\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435\u00a0\u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<br \/><code>args, not_parsed = parser.parse_known_args(['a', '-a', '12', 'b', '-b', '32', '-d', '11'])<\/code> &#8212; \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435\u00a0\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435. <\/p>\n<p><code>args, not_parsed = parser.parse_known_args(not_parsed)<\/code> &#8212; \u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435\u00a0\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.<\/p>\n<p>\u0414\u0430,\u00a0\u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.\u00a0\u041e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e.\u00a0\u041e\u0434\u043d\u0430\u043a\u043e \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f,\u00a0\u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.\u00a0\u0414\u0430,\u00a0\u043a\u0440\u0443\u0442\u043e. \u041d\u043e \u043c\u043d\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f,\u00a0\u0447\u0442\u043e \u044f \u043d\u0435 \u043c\u043e\u0433\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u0440\u0430\u0437 \u0438 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043d\u0435\u0439, \u043d\u043e \u0435\u0449\u0435 \u0438 \u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u044b argparse. \u0412 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432 \u044f \u043f\u0440\u0438\u0431\u0435\u0433\u043d\u0443\u043b \u043a \u0441\u043f\u043e\u0441\u043e\u0431\u0443 2.\u00a0<\/p>\n<h4>\u0418\u0442\u0430\u043a, \u0441\u043f\u043e\u0441\u043e\u0431 2<\/h4>\n<p>\u0421\u043f\u043e\u0441\u043e\u0431 2 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0444\u043e\u0440\u043a, \u0438\u0437\u043c\u0435\u043d\u0438\u0432 \u043b\u043e\u0433\u0438\u043a\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 argparse. \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u043e\u0442\u043e\u0440 \u043d\u0430 \u0437\u0430\u043f\u0447\u0430\u0441\u0442\u0438. \u0412\u043d\u0443\u0442\u0440\u0438 protected-\u043c\u0435\u0442\u043e\u0434\u0430 <code>_parse_known_args<\/code> \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0446\u0438\u043a\u043b, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0439, \u0447\u0442\u043e \u0438\u0437 \u0432\u0441\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u043c\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438, \u0430 \u0447\u0442\u043e \u2014 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<pre><code class=\"python\">for i, arg_string in enumerate(arg_strings_iter):    # all args after -- are non-options   if arg_string == '--':     arg_string_pattern_parts.append('-')     for arg_string in arg_strings_iter:       arg_string_pattern_parts.append('A')    # otherwise, add the arg to the arg strings   # and note the index if it was an option   else:     option_tuple = self._parse_optional(arg_string)     if option_tuple is None:       pattern = 'A'       else:         option_string_indices[i] = option_tuple         pattern = 'O'         arg_string_pattern_parts.append(pattern) <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0433\u0432\u043e\u0437\u0434\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u2014 protected-\u043c\u0435\u0442\u043e\u0434 <code>_parse_optional<\/code>, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0430 \u043f\u043e\u043b\u043d\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443, \u0447\u0442\u043e \u0438\u0437 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u2014 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0430 \u0447\u0442\u043e \u2014 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b. \u0415\u0441\u043b\u0438 \u043d\u0430\u0448\u043b\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435\u00a0<code>O<\/code>, \u0432\u043e \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u2014 <code>A.<\/code><\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0438 \u0437\u0430\u043f\u0443\u0442\u0430\u043d\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u043e\u0432. \u0412\u0441\u0435 \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043c\u043e\u0447\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0435 \u0441\u0430\u043c\u044b\u0435 <code>known_args<\/code> (\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b). \u041d\u043e \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u044d\u0442\u043e\u043c \u0446\u0438\u043a\u043b\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0432 \u043d\u0435\u043c. \u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u0432\u044b\u0437\u043e\u0432 <code>Actions<\/code><em>:\u00a0<\/em><\/p>\n<pre><code class=\"python\">def take_action(action, argument_strings, option_string=None):   seen_actions.add(action)   argument_values = self._get_values(action, argument_strings)    # error if this argument is not allowed with other previously   # seen arguments, assuming that actions that use the default   # value don't really count as \"present\"   if argument_values is not action.default:     seen_non_default_actions.add(action)     for conflict_action in action_conflicts.get(action, []):       if conflict_action in seen_non_default_actions:         msg = _('not allowed with argument %s')         action_name = _get_action_name(conflict_action)         raise ArgumentError(action, msg % action_name)    # take the action if we didn't receive a SUPPRESS value   # (e.g. from a default)   if argument_values is not SUPPRESS:     action(self, namespace, argument_values, option_string) <\/code><\/pre>\n<p><em>\u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0430\u0441 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u044d\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u0430: <\/em><code>action(self, namespace, argument_values, option_string)<\/code>.<\/p>\n<p><em>\u0414\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0432\u0441\u0435 \u0432 Python \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c. \u0410 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u0441\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c, \u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u0441\u0432\u043e\u0438\u0445 \u0446\u0435\u043b\u044f\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0442\u043e\u0431\u044b\u00a0\u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u041a\u0430\u043a \u0442\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442? \u0412\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e: \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u2014 \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432\u00a0\u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u043b\u044e\u0431\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b.<\/em><\/p>\n<p><em>\u041e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u2014 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 <\/em><code>action<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435\u00a0<code>take_action<\/code>. \u041f\u0440\u0438\u0447\u0435\u043c \u044d\u0442\u043e \u043d\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0430 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0439 \u043e\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u0410 \u0442\u043e\u0442, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0441\u043e\u0437\u0434\u0430\u043d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u0430\u043a\u043b\u0430\u0441\u0441\u0430. \u042d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0434\u043e\u043b\u0433\u043e, \u043f\u043e\u0432\u0435\u0440\u044c\u0442\u0435&#8230; \u041d\u043e \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044e. \u0412\u00a0\u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>action<\/code> \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e\u00a0<code>_SubParsersAction<\/code>. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442,\u00a0\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430\u00a0<code>_SubParsersAction<\/code>,\u00a0\u0431\u0443\u0434\u0435\u0442:<\/p>\n<ol>\n<li>\n<p><em>\u0441\u043e\u0437\u0434\u0430\u043d \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c\u00a0<\/em><code>new<\/code>, <\/p>\n<\/li>\n<li>\n<p><em>\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u00a0<\/em><code>init<\/code>,<\/p>\n<\/li>\n<li>\n<p><em>\u0432\u044b\u0437\u0432\u0430\u043d \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438\u00a0<\/em><code>call<\/code>. <\/p>\n<\/li>\n<\/ol>\n<p><em>\u0412\u0441\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e, \u0435\u0441\u043b\u0438 \u0431\u044b \u0432 Python \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0438 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u0440\u0438 \u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438. \u042f, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0442\u043e\u0433\u0434\u0430 \u0438 \u043d\u0435 \u043f\u0438\u0441\u0430\u043b \u0431\u044b \u043d\u0430 \u00ab\u0425\u0430\u0431\u0440\u00bb. \u041d\u043e \u0440\u0430\u0437 \u0441\u0442\u0430\u0442\u044c\u044f \u0443\u0432\u0438\u0434\u0435\u043b\u0430 \u0441\u0432\u0435\u0442, \u0437\u043d\u0430\u0447\u0438\u0442, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u043c\u0430\u0445\u0438\u043d\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0438 \u0434\u0430\u0436\u0435 \u043d\u0443\u0436\u043d\u043e! <\/em><\/p>\n<p><em>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0445\u043e\u0440\u043e\u0448\u0438\u0439, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b \u043c\u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0435\u0447\u044c \u0448\u043b\u0430 \u0440\u0430\u043d\u0435\u0435, \u2014 <\/em><code>parse_known_args<\/code>:<\/p>\n<pre><code class=\"python\">    def __call__(self, parser, namespace, values, option_string=None): parser_name = values[0] arg_strings = values[1:]     # set the parser name if requested     if self.dest is not SUPPRESS:         setattr(namespace, self.dest, parser_name)      # select the parser     try:         parser = self._name_parser_map[parser_name]     except KeyError:         args = {'parser_name': parser_name,                 'choices': ', '.join(self._name_parser_map)}         msg = _('unknown parser %(parser_name)r (choices: %(choices)s)') % args         raise ArgumentError(self, msg)      subnamespace, arg_strings = parser.parse_known_args(arg_strings, None)     for key, value in vars(subnamespace).items():         setattr(namespace, key, value)      if arg_strings:         vars(namespace).setdefault(_UNRECOGNIZED_ARGS_ATTR, [])         getattr(namespace, _UNRECOGNIZED_ARGS_ATTR).extend(arg_strings)  <\/code><\/pre>\n<p><em>\u041e\u043f\u044f\u0442\u044c \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0431\u0435\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432! <\/em><\/p>\n<p><strong><em>\u042f \u0431\u044b \u0445\u043e\u0442\u0435\u043b \u0434\u0430\u0442\u044c \u0432\u0430\u043c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0440\u0430\u0437\u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u043d\u0435 \u0442\u0430\u043a. \u041f\u043e\u0434\u0443\u043c\u0430\u0439\u0442\u0435 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0439\u0442\u0435 \u0447\u0438\u0442\u0430\u0442\u044c.<\/em><\/strong>*<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u043f\u0438\u0448\u0443 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0442\u0443\u0442.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0430\u0440\u0441\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0442\u0435\u043c \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>values<\/code> \u0438 \u0435\u0433\u043e \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043b\u044e\u0447\u0430 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0432 \u0441\u0435\u0431\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u043f\u0430\u0440\u0441\u0435\u0440\u0430\u0445: <code>self._name_parser_map[parser_name]<\/code>. \u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u2014 \u043e\u0431\u044a\u0435\u043a\u0442, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0439 \u0432 \u0441\u0435\u0431\u0435 <code>action<\/code> \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e (\u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e) \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430. \u0418 \u044d\u0442\u043e, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u043e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0432\u0430\u0436\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e <code>parser<\/code> \u0432 \u043d\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f <code>_StoreAction<\/code>,\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0437\u0432\u0430\u043d \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>parser.parse_known_args(arg_strings, None)<\/code>, \u043d\u043e \u0443\u0436\u0435 \u0434\u043b\u044f \u0432\u043d\u043e\u0432\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>parser. <\/code>\u0412\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>values<\/code>, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u0432 <code>arg_strings<\/code>. \u041e\u043d\u0438 \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u2014 \u0432 \u044d\u0442\u043e\u043c \u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430.\u00a0<\/p>\n<p>\u041f\u0440\u043e\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, <code>_SubParsersAction<\/code> \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043a\u0443\u0447\u0443 <code>actions<\/code>,\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438 \u043f\u0443\u0442\u0435\u043c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0434\u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432, \u043d\u043e \u0432 \u0432\u0438\u0434\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u2014 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441\u0430\u043c\u043e \u043f\u043e\u043b\u0435 \u0442\u0430\u043a \u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>\u041f\u043e \u0438\u0442\u043e\u0433\u0443\u00a0\u0431\u0435\u0440\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u0439 <code>Action<\/code> \u0438\u0437 \u044d\u0442\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043f\u0430\u0440\u0441\u0438\u0442\u0441\u044f\u00a0\u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0432\u0441\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u041f\u043e\u0447\u0435\u043c\u0443 \u0432\u0441\u0435 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0442\u0430\u043a, \u0447\u0442\u043e \u0431\u0435\u0440\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0439 <code>Action<\/code> \u0438\u0437 \u0432\u044b\u0431\u043e\u0440\u043a\u0438? \u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0443\u00a0\u043e\u0431 \u044d\u0442\u043e\u043c \u0432 \u043a\u043e\u043d\u0446\u0435. <\/p>\n<h3>\u0425\u0435\u043f\u043f\u0438-\u044d\u043d\u0434, \u0438\u043b\u0438 \u0415\u0449\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0435 2\u00a0<\/h3>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c,\u00a0\u0441\u0434\u0435\u043b\u0430\u043b \u0444\u043e\u0440\u043a \u0438 \u0433\u043e\u0442\u043e\u0432 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0438\u043c \u0441 \u0432\u0430\u043c\u0438:<\/p>\n<pre><code class=\"python\">    def __call__(self, parser, namespace, values, option_string=None, arg_strings_pattern:list =None):         o_amount = arg_strings_pattern.count(\"O\")         if not o_amount:             raise ValueError(\"No Os found\")         o_start, o_stop, indexes = arg_strings_pattern.index('O'), len(arg_strings_pattern), []         print(parser)         try:             while arg_strings_pattern.index('O', o_start, o_stop):                 indexes.append(arg_strings_pattern.index('O', o_start, o_stop))                 o_start = arg_strings_pattern.index('O', o_start + 1, o_stop)         except ValueError:             pass          used_indexes = []         known_args = {}         for i, index in enumerate(indexes):             parser_name = values[index - 1]             if not known_args.get(parser_name):                 known_args[parser_name] = []                 known_args[parser_name] += values[index: indexes[i + 1] - 1] if i + 1 &lt; len(indexes) else values[index:]             if index not in used_indexes:                 for s, subindex in enumerate(indexes[1:]):                     subparser_name = values[subindex - 1]                     if parser_name == subparser_name:                         used_indexes.append(index)                         used_indexes.append(subindex)                         subparser_args = values[subindex: indexes[s + 2] - 1] if s + 2 &lt; len(indexes) else values[subindex:]                         known_args[parser_name] += subparser_args          for parser_name, args in known_args.items():             self._create_parser(namespace, parser_name, args)      def _create_parser(self, namespace, parser_name, arg_strings):          if self.dest is not SUPPRESS:             setattr(namespace, self.dest, parser_name)          try:             parser = self._name_parser_map[parser_name]         except KeyError:             args = {'parser_name': parser_name,                     'choices': ', '.join(self._name_parser_map)}             msg = _('unknown parser %(parser_name)r (choices: %(choices)s)') % args             raise ArgumentError(self, msg)          subnamespace, arg_strings = parser.parse_known_args(arg_strings, None)         for key, value in vars(subnamespace).items():             setattr(namespace, key, value)          if arg_strings:             vars(namespace).setdefault(_UNRECOGNIZED_ARGS_ATTR, [])             getattr(namespace, _UNRECOGNIZED_ARGS_ATTR).extend(arg_strings)  <\/code><\/pre>\n<p>\u0412\u044b\u0448\u0435 \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u0447\u0442\u043e \u043c\u044b \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432\u0438\u0434\u0430 <code>AAAAOAAAOAA.<\/code> \u0422\u0430\u043a \u0432\u043e\u0442, \u044d\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 \u043c\u0435\u043d\u044f \u0441\u0438\u043b\u044c\u043d\u043e \u0432\u044b\u0440\u0443\u0447\u0438\u043b\u0430. \u042f \u043f\u043e\u0447\u0442\u0438 \u0441\u0434\u0430\u043b\u0441\u044f, \u043f\u043e\u043a\u0430 \u0440\u0430\u0437\u0433\u0430\u0434\u044b\u0432\u0430\u043b, \u043a\u0430\u043a \u043b\u0443\u0447\u0448\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u043b\u043e\u043c\u0430\u0432. \u0412\u044b\u0445\u043e\u0434\u0438\u0442, \u0447\u0442\u043e \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u0433\u0434\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430, \u0433\u0434\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0435\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p>\u0412 <a href=\"https:\/\/github.com\/rive-n\/Gitlab-exploitation-toolkit\/blob\/master\/argfork.py\">\u044d\u0442\u043e\u043c<\/a> \u0444\u043e\u0440\u043a\u0435 \u044f \u0441\u043e\u0437\u0434\u0430\u044e \u043f\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0443-\u043f\u0430\u0440\u0441\u0435\u0440\u0443, \u0432\u044b\u044f\u0441\u043d\u044f\u044f \u0438\u0437 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c \u0432\u043d\u043e\u0432\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430, \u0430 \u0447\u0442\u043e, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0435\u0442. \u0417\u0430\u0442\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u043f\u043e \u043d\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u044b \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u0430-\u043f\u0430\u0440\u0441\u0435\u0440\u0430:<\/p>\n<pre><code class=\"python\">o_amount = arg_strings_pattern.count(\"O\") if not o_amount: raise ValueError(\"No Os found\") o_start, o_stop, indexes = arg_strings_pattern.index('O'), len(arg_strings_pattern), [] try: while arg_strings_pattern.index('O', o_start, o_stop): indexes.append(arg_strings_pattern.index('O', o_start, o_stop)) o_start = arg_strings_pattern.index('O', o_start + 1, o_stop) except ValueError: pass <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c\u00a0\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u2014 \u043d\u0443\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u043c\u0435\u0434\u0438\u0430\u043d\u0443 \u043c\u0435\u0436\u0434\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0432\u044b\u0445\u043e\u0434\u044f \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>values<\/code>:<\/p>\n<pre><code class=\"python\">used_indexes = [] known_args = {} for i, index in enumerate(indexes): parser_name = values[index - 1] if not known_args.get(parser_name): known_args[parser_name] = [] known_args[parser_name] += values[index: indexes[i + 1] - 1] if i + 1 &lt; len(indexes) else values[index:] if index not in used_indexes: for s, subindex in enumerate(indexes[1:]): subparser_name = values[subindex - 1] if parser_name == subparser_name: used_indexes.append(index) used_indexes.append(subindex) subparser_args = values[subindex: indexes[s + 2] - 1] if s + 2 &lt; len(indexes) else values[subindex:] known_args[parser_name] += subparser_args  for parser_name, args in known_args.items(): self._create_parser(namespace, parser_name, args) <\/code><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435\u00a0\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043b \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430. \u041f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u043b \u043e\u0441\u0442\u0430\u0432\u0448\u0443\u044e\u0441\u044f, \u0441\u0442\u0430\u0440\u0443\u044e\u00a0\u0447\u0430\u0441\u0442\u044c.<\/p>\n<p>\u0412\u044b\u0448\u0435 \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u0447\u0442\u043e \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u043b\u043e\u043c\u0430\u0442\u044c. \u0427\u0442\u043e \u0436\u0435, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u044f \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0438 \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u043b\u043e\u043c\u0430\u043b. \u0422\u0430\u043a \u043a\u0430\u043a \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u0442\u043e \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043b\u0438\u0448\u043d\u0435\u0433\u043e, \u0432\u0435\u0434\u044c \u043b\u0438\u0448\u043d\u0435\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u00a0\u043d\u0435 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>\u042d\u0442\u043e,\u00a0\u043a\u043e\u043d\u0435\u0447\u043d\u043e,\u00a0\u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a-\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c,\u00a0\u043d\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043c\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438,\u00a0\u0434\u0443\u043c\u0430\u044e,\u00a0\u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u043e\u0436\u0435. \u0411\u0443\u0434\u0435\u0442 \u043d\u0435 \u0442\u0430\u043a \u0437\u0434\u043e\u0440\u043e\u0432\u043e, \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443-\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0435\u0449\u0435 \u0438 \u043e\u0442\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u043b\u0438\u0448\u043d\u0438\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b.<\/p>\n<p>\u041f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0431\u044b\u043b\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0438 \u0440\u0430\u043d\u0435\u0435. \u041d\u0438\u043a\u0442\u043e \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043b, \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432 \u043d\u0435 \u043f\u0430\u0440\u0441\u044f\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443. <\/p>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0440\u0435\u0448\u0435\u043d\u0430 \u2014 \u0432\u0440\u0435\u043c\u044f \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435,\u00a0\u043a \u0442\u0435\u043c\u0435 \u043f\u0435\u0440\u0435\u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432.<\/p>\n<h3>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0435\u0440\u0435\u0441\u0431\u043e\u0440\u043a\u0438: \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/h3>\n<p>\u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430-\u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0435\u0441\u0442\u044c <code>actions<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043f\u0430\u0440\u0441\u0435\u0440\u0443, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u043d\u0435\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:\u00a0<\/p>\n<ul>\n<li>\n<p><code>_HelpActions<\/code>,\u00a0\u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0435 \u0437\u0430 \u0432\u044b\u0432\u043e\u0434\u00a0help;<\/p>\n<\/li>\n<li>\n<p><code>_StoreActions<\/code>, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0435 \u0437\u0430\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438,\u00a0\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0439 \u043d\u0430\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u00a0\u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c\u00a0\u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b <code>_StoreActions<\/code>. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u043f\u0430\u0440\u0441\u0435\u0440\u0430:<\/p>\n<pre><code class=\"python\">parser = argparse.ArgumentParser(prog='PROG') parser.add_argument('--foo', action='store_true', help='foo help')  subparsers = parser.add_subparsers(help='sub-command help')  parser_a = subparsers.add_parser('a', help='a help') parser_a.add_argument('-a', help='bar help')  parser_b = subparsers.add_parser('b', help='b help') parser_b.add_argument('-b', help='baz help') <\/code><\/pre>\n<p>\u0418\u0437 \u0432\u0430\u0436\u043d\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438:<\/p>\n<pre><code class=\"python\">parser = argparse.ArgumentParser(prog='PROG') # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u0430\u0440\u0441\u0435\u0440 subparsers = parser.add_subparsers(help='sub-command help') # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432 parser_a = subparsers.add_parser('a', help='a help') # \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043f\u0430\u0440\u0441\u0435\u0440 ...<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e: \u043a\u0442\u043e-\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043b 20 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432, \u0438 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u043e\u0434\u0438\u043d\u00a0\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439. \u0414\u0430, \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430\u044f, \u043d\u043e, \u043a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u0441\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>\u041a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c:<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u0430\u0440\u0441\u0435\u0440.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b-\u043f\u0430\u0440\u0441\u0435\u0440\u044b.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043f\u0430\u0440\u0441\u0435\u0440.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u0446\u0438\u043a\u043b\u043e\u043c \u043f\u043e \u0432\u0441\u0435\u043c (\u043f\u043e\u043a\u0430 \u0435\u0449\u0435 \u043d\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c) \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c-\u043f\u0430\u0440\u0441\u0435\u0440\u0430\u043c:<br \/>    4.1. \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0434\u043f\u0430\u0440\u0441\u0435\u0440.<br \/>    4.2. \u0412\u0437\u044f\u0442\u044c <code>_actions<\/code>\u00a0 \u0438\u0437 \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u043d\u0430\u043c.<br \/>    4.3. \u0418\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 <code>_actions<\/code> \u0432 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043f\u0430\u0440\u0441\u0435\u0440.<\/p>\n<\/li>\n<\/ol>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0432\u0441\u0435 \u044d\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0443 \u043c\u0435\u043d\u044f \u043d\u0430 <a href=\"https:\/\/github.com\/rive-n\/Gitlab-exploitation-toolkit\">GitHub<\/a>\u00a0\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">import argparse from PluginHandler import AnotherPlugin   class ParserMetaclass(type):     def __new__(mcs, name, bases, dct):         if name != \"ArgumentParser\":             if not dct.get(\"_PluginLink\"):                 raise LookupError(f\"Link in {mcs} for parent class not found. Terminating\")             if not dct.get(\"__plugin_name__\"):                 dct[\"__plugin_name__\"] = name                 print(name)         parser_object = type.__new__(mcs, name, bases, dct)         return parser_object   class ArgumentParser(metaclass=ParserMetaclass):     \"\"\"     # Every plugin class should have:     # _PluginLink = Plugin, where     # _PluginLink is basic link to object     # __plugin_name__ -> name, that could     # allow you to use your own parser     # from parent one.      # Every class should have     # __parser__name__     # otherwise plugin subparser     # call name will be generated     # from className      # The only problem is in conflict     # The only way (as i think) is to use     # conflict_handler='resolve' handler     # that will by default resolve all     # conflicts in the program.      # If you don't want to auto editing, &lt;- TODO     # just inherit from this class and change     # parser options like this:     # https:\/\/docs.python.org\/3\/library\/argparse.html#other-utilities     \"\"\"      test = \"test\"      def __init__(self):         self.parent_parser = argparse.ArgumentParser(conflict_handler='resolve')      def __recreate_parser(self, created_parsers: dict):         \"\"\"         Example parser ._actions:         _HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None,         choices=None, help='show this help message and exit', metavar=None)         _StoreAction(option_strings=['-t', '--test'], dest='test', nargs=None, const=None, default=None, type=None,         choices=None, help=None, metavar=None)         _StoreAction(option_strings=['-p', '--plugin'], dest='plugin', nargs=None, const=None, default=None, type=None,         choices=None, help=None, metavar=None)          So this method is created for recreation of parser to insert it into the \"parent\"         :param created_parser:         :return:         \"\"\"         subparsers = self.parent_parser.add_subparsers()          for parser, name in created_parsers.items():             if isinstance(parser, argparse.ArgumentParser):                 \"\"\"                 We could use parser._option_string_actions                 But afterwards there is pretty hard way to resolve                 all argparse objects. So that's is optimal way                  \"\"\"                 parser_actions = parser._actions                 if parser_actions:                     plugin_subparser = subparsers.add_parser(name=name)                     for action in parser_actions:                         action_kwargs = dict(action._get_kwargs())                         if isinstance(action, argparse._HelpAction):                             \"\"\"                             Passing this _HelpAction because of every                              _*StoreAction is linked to it's own _HelpAction                             \"\"\"                             continue                         \"\"\"                         From lib source:                                      # if no positional args are supplied or only one is supplied and                                 # it doesn't look like an option string, parse a positional                                 # argument                                                  >> return dict(kwargs, dest=dest, option_strings=[])                                                  So option_strings will be empty.                         \"\"\"                         options = action_kwargs['option_strings']                         action_kwargs.pop('option_strings')                         plugin_subparser.add_argument(*options, **action_kwargs) <\/code><\/pre>\n<p>\u042d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c N\u00a0\u043f\u043e\u0434\u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u0430\u0448\u0438\u0445 \u043d\u0443\u0436\u0434. \u0410 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0444\u043e\u0440\u043a\u043e\u043c \u044d\u0442\u043e \u0434\u0430\u0441\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043d\u0438\u0445 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b.<\/p>\n<p>\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432 \u043e\u0431\u0449\u0435\u0439 \u0441\u0443\u043c\u043c\u0435 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">import argfork as argparse  from PluginsArgumentParser import ArgumentParser  pars = ArgumentParser()  test1 = argparse.ArgumentParser() test1.add_argument(\"-t\")  test2 = argparse.ArgumentParser() test2.add_argument(\"-r\")  test3 = argparse.ArgumentParser() test3.add_argument(\"-b\")  res_dict = {     test1: \"Plugin1\",     test2: \"Plugin2\",     test3: \"Plugin3\" }  pars.setup(res_dict) args, unk_args = (pars.parent_parser.parse_known_args(     [\"Plugin1\", '-t', '1', \"Plugin2\", '-r', '2', \"Plugin3\", '-b', '3'] )) <\/code><\/pre>\n<h3>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/h3>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0441 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f argparse \u0431\u0435\u0437 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439:<\/p>\n<pre><code class=\"python\">import argparse  parser = argparse.ArgumentParser(prog='PROG') subparsers = parser.add_subparsers(help='sub-command help')  # create the parser for the \"a\" command parser_a = subparsers.add_parser('a', help='a help') parser_a.add_argument('-a', help='bar help')  # create the parser for the \"b\" command parser_b = subparsers.add_parser('b', help='b help') parser_b.add_argument('-b', help='baz help')  # parse some argument lists args, unk_args = (parser.parse_known_args(['a', '-a', '12', 'b', '-b', '32',])) # args, unk_args = (parser.parse_known_args(unk_args)) print(args, unk_args) <\/code><\/pre>\n<p>\u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435: <code>Namespace(a='12', foo=False) ['b', '-b', '32']<\/code> \u2014 \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043f\u0430\u0440\u0441\u0438\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p> \u0422\u0435\u043f\u0435\u0440\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0444\u043e\u0440\u043a <code>import argfork as argparse<\/code>: <code>Namespace(a='12', b='32') []<\/code>, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0432\u0441\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432.<\/p>\n<p>\u0421\u0430\u043c\u044b\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, \u0447\u0442\u043e \u0438\u0437 \u0432\u044b\u0432\u043e\u0434\u0430 \u0432 \u0444\u043e\u0440\u043a\u0435 \u043f\u0440\u043e\u043f\u0430\u043b\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>foo=False<\/code>. \u042d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0N \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432 \u0438 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0432\u043a\u0443\u043f\u0435 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445. \u041c\u043e\u0436\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e, \u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0443\u0442. <\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u044b\u0435 \u044e\u043d\u0438\u0442-\u0442\u0435\u0441\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c:<\/p>\n<pre><code class=\"python\">import unittest import argfork as argparse from argfork import Namespace  class argparseTest(unittest.TestCase):   def setUp(self) -&amp;gt; None:       self.parser = argparse.ArgumentParser(prog='PROG')       subparsers = self.parser.add_subparsers(help='sub-command help')        # create the parser for the \"a\" command       parser_a = subparsers.add_parser('a', help='a help')       parser_a.add_argument('-a', help='bar help')        # create the parser for the \"b\" command       parser_b = subparsers.add_parser('b', help='b help')       parser_b.add_argument('-b', help='baz help')       parser_b.add_argument('-q', help='baz help')        # create the parser for the \"c\" command       parser_b = subparsers.add_parser('c', help='b help')       parser_b.add_argument('-c', help='baz help')       parser_b.add_argument('-k', help='baz help')        # create the parser for the \"c\" command       parser_b = subparsers.add_parser('d', help='b help')       parser_b.add_argument('-d', help='baz help')       parser_b.add_argument('-D', help='baz help')       parser_b.add_argument('-R', help='baz help')    def testSimple(self):       case = ['a', '-a', 'test']       res_obj = Namespace(a='test').__dict__       rest_obj = self.parser.parse_known_args(case)[0].__dict__        res_k, res_v = res_obj.keys(), list(res_obj.values())       test_k, test_v = rest_obj.keys(), list(rest_obj.values())        self.assertEqual(res_v, test_v)       self.assertEqual(res_k, test_k)    def testMany(self):       case = ['d', '-d', '1234', 'd', '-D', '12345', 'd', '-R', '1', 'c', '-c', '123', 'c', '-k', '555', 'b', '-q', 'test']       res_obj = Namespace(d='1234', D='12345', R='1', c='123', k='555', b=None, q='test').__dict__       rest_obj = self.parser.parse_known_args(case)[0].__dict__        res_k, res_v = res_obj.keys(), list(res_obj.values())       test_k, test_v = rest_obj.keys(), list(rest_obj.values())        self.assertEqual(res_v, test_v)       self.assertEqual(res_k, test_k)    def testZero(self):       case = []       res_obj = Namespace().__dict__       rest_obj = self.parser.parse_known_args(case)[0].__dict__        res_k, res_v = res_obj.keys(), list(res_obj.values())       test_k, test_v = rest_obj.keys(), list(rest_obj.values())        self.assertEqual(res_v, test_v)       self.assertEqual(res_k, test_k)  if name == 'main': unittest.main() <\/code><\/pre>\n<p>\u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435:<code>Ran 3 tests in 0.007s  OK<\/code><\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0445\u043e\u0447\u0443 \u0438\u0433\u0440\u0430\u0442\u044c \u0441\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c <code>argparse<\/code>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ebc\/c9c\/cd1\/ebcc9ccd11b005f7192352655ddb4389.png\" width=\"2000\" height=\"1125\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ebc\/c9c\/cd1\/ebcc9ccd11b005f7192352655ddb4389.png\"\/><figcaption><\/figcaption><\/figure>\n<h3>\u0421\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u043c\u043d\u043e\u0439:<\/h3>\n<p>\u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u043a\u0430\u043d\u0430\u043b: <a href=\"https:\/\/t.me\/r1v3ns_life\">https:\/\/t.me\/r1v3ns_life<\/a><br \/>\u0421\u043e\u0440\u0446\u044b: <a href=\"https:\/\/github.com\/rive-n\/Gitlab-exploitation-toolkit\">https:\/\/github.com\/rive-n\/Gitlab-exploitation-toolkit<\/a><br \/>\u042f: <a href=\"https:\/\/t.me\/rive_n\">https:\/\/t.me\/rive_n<\/a><\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \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\/company\/bizone\/blog\/663540\/\"> https:\/\/habr.com\/ru\/company\/bizone\/blog\/663540\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442.\u00a0\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u043c\u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0440\u0430\u0442\u044c N\u00a0\u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432\u00a0\u0432 \u043e\u0434\u0438\u043d. \u0412 \u043d\u0435\u043c\u00a0\u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c\u00a0\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u0438\u00a0N\u00a0\u0434\u0435\u0442\u0435\u0439, \u0430 \u0442\u0430\u043a\u0436\u0435\u00a0\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438\u00a0\u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u0435\u0445\u00a0\u043f\u043e\u0434\u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432.<\/p>\n<p>\u0421\u043f\u043e\u0439\u043b\u0435\u0440: \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e! \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u044e, \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u043c\u043e\u0434\u0443\u043b\u044c argparse \u0432 Python 3 \u0438 \u0447\u0442\u043e \u043e\u043d \u0443\u043c\u0435\u0435\u0442.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0430\u0440\u0441\u0435\u0440 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044d\u0442\u043e\u0442 \u043c\u043e\u0434\u0443\u043b\u044c. \u0418 \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u0442\u0435 Python \u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0441\u043e\u043a\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435, \u043f\u043e\u043d\u044f\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0442\u0443\u0442, \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e.<\/p>\n<h3>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u0434\u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u043b\u0443\u0447\u0448\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0441\u0443\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b,\u00a0\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0430\u043c\u044b\u0439 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0430\u0440\u0441\u0435\u0440\u0430,\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.\u00a0\u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u0437\u044f\u0442 \u0438\u0437 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439\u00a0\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"python\">import argparse parser = argparse.ArgumentParser(prog='PROG') parser.add_argument('--foo', action='store_true', help='foo help')  subparsers = parser.add_subparsers(help='sub-command help')  parser_a = subparsers.add_parser('a', help='a help') parser_a.add_argument('-a', help='bar help')  parser_b = subparsers.add_parser('b', help='b help') parser_b.add_argument('-b', help='baz help')  parser.parse_known_args(['a', '-a', '12', 'b', '-b', '32', '-d', '11']) > Namespace(a=12) ['b', '-b', '32', '-d', '11'] <\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0432 \u043a\u043e\u0434\u0435\u00a0\u2014\u00a0\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0441\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435: <\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><em>Sometimes a script may only parse a few of the command-line arguments, passing the remaining arguments on to another script or program. In these cases, the <\/em><code>parse_known_args()<\/code><em> method can be useful. It works much like <\/em><code>parse_args()<\/code><em> except that it does not produce an error when extra arguments are present. Instead, it returns a two item tuple containing the populated namespace and the list of remaining argument strings.<\/em><\/p>\n<\/td>\n<td>\n<p align=\"left\"><em>\u0418\u043d\u043e\u0433\u0434\u0430 \u0441\u043a\u0440\u0438\u043f\u0442 \u043c\u043e\u0436\u0435\u0442 \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0441\u043a\u0440\u0438\u043f\u0442\u0443 \u0438\u043b\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435. \u0412 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u043c\u0435\u0442\u043e\u0434 <\/em><code>parse_known_args()<\/code><em>. \u041e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a <\/em><code>parse_args()<\/code><em>, \u043d\u043e \u043d\u0435 \u0432\u044b\u0434\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u0440\u0442\u0435\u0436 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0447\u043b\u0435\u043d\u043e\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0435\u043d \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0442\u0440\u043e\u043a \u0441 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u043c\u0438\u0441\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438.<\/em><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0437\u0430 \u043e\u0434\u0438\u043d \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432 \u0431\u0435\u0437 \u0442\u0430\u043d\u0446\u0435\u0432 \u0441 \u0431\u0443\u0431\u043d\u0430\u043c\u0438. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0431\u043e\u043b\u0435\u0435 \u0441\u043a\u0440\u0443\u043f\u0443\u043b\u0435\u0437\u043d\u043e \u2014 \u0438 \u0432\u0441\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u044f\u0441\u043d\u043e.<\/p>\n<pre><code class=\"python\">import argparse parser = argparse.ArgumentParser(prog='PROG') # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \"\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439\" \u043f\u0430\u0440\u0441\u0435\u0440. parser.add_argument('--foo', action='store_true', help='foo help')  subparsers = parser.add_subparsers(help='sub-command help') # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432.  parser_a = subparsers.add_parser('a', help='a help') # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043f\u0430\u0440\u0441\u0435\u0440. parser_a.add_argument('-a', help='bar help')  parser_b = subparsers.add_parser('b', help='b help') # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043f\u0430\u0440\u0441\u0435\u0440. parser_b.add_argument('-b', help='baz help')  parser.parse_known_args(['a', '-a', '12', 'b', '-b', '32', '-d', '11']) # \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u0411\u044b\u043b\u043e \u0431\u044b \u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043a\u043e\u0440\u0442\u0435\u0436, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432. \u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 - \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0438\u0436\u0435 \u043d\u0438\u0436\u0435. > Namespace(a=12) ['b', '-b', '32', '-d', '11'] # \u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 - \u043a\u043e\u0440\u0442\u0435\u0436, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0438\u0437 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 Namespace, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0445 \u0437\u0430 \u0441\u043f\u0430\u0440\u0448\u0435\u043d\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u043b\u0438\u0441\u0442, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u043b\u0438\u0448\u043d\u0438\u0435, \u043d\u0435\u0441\u043f\u0430\u0440\u0448\u0435\u043d\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. <\/code><\/pre>\n<h3>\u0418 \u0447\u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u0434\u0435\u043b\u0430\u0442\u044c?<\/h3>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430 \u043e\u0434\u0438\u043d \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438. \u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u0432\u0430 \u0438\u0437 \u043d\u0438\u0445.\u00a0<\/p>\n<h4>\u0421\u043f\u043e\u0441\u043e\u0431 1<\/h4>\n<p>\u0418\u043c\u0435\u044f \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432, \u043c\u043e\u0436\u043d\u043e N \u0440\u0430\u0437 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>parse_known_args<\/code>, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 \u043b\u0438\u0448\u043d\u0438\u0445\u00a0\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435\u00a0\u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<br \/><code>args, not_parsed = parser.parse_known_args(['a', '-a', '12', 'b', '-b', '32', '-d', '11'])<\/code> &#8212; \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435\u00a0\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435. <\/p>\n<p><code>args, not_parsed = parser.parse_known_args(not_parsed)<\/code> &#8212; \u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435\u00a0\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.<\/p>\n<p>\u0414\u0430,\u00a0\u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.\u00a0\u041e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e.\u00a0\u041e\u0434\u043d\u0430\u043a\u043e \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f,\u00a0\u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.\u00a0\u0414\u0430,\u00a0\u043a\u0440\u0443\u0442\u043e. \u041d\u043e \u043c\u043d\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f,\u00a0\u0447\u0442\u043e \u044f \u043d\u0435 \u043c\u043e\u0433\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u0440\u0430\u0437 \u0438 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043d\u0435\u0439, \u043d\u043e \u0435\u0449\u0435 \u0438 \u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u044b argparse. \u0412 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432 \u044f \u043f\u0440\u0438\u0431\u0435\u0433\u043d\u0443\u043b \u043a \u0441\u043f\u043e\u0441\u043e\u0431\u0443 2.\u00a0<\/p>\n<h4>\u0418\u0442\u0430\u043a, \u0441\u043f\u043e\u0441\u043e\u0431 2<\/h4>\n<p>\u0421\u043f\u043e\u0441\u043e\u0431 2 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0444\u043e\u0440\u043a, \u0438\u0437\u043c\u0435\u043d\u0438\u0432 \u043b\u043e\u0433\u0438\u043a\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 argparse. \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u043e\u0442\u043e\u0440 \u043d\u0430 \u0437\u0430\u043f\u0447\u0430\u0441\u0442\u0438. \u0412\u043d\u0443\u0442\u0440\u0438 protected-\u043c\u0435\u0442\u043e\u0434\u0430 <code>_parse_known_args<\/code> \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0446\u0438\u043a\u043b, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0439, \u0447\u0442\u043e \u0438\u0437 \u0432\u0441\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u043c\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438, \u0430 \u0447\u0442\u043e \u2014 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<pre><code class=\"python\">for i, arg_string in enumerate(arg_strings_iter):    # all args after -- are non-options   if arg_string == '--':     arg_string_pattern_parts.append('-')     for arg_string in arg_strings_iter:       arg_string_pattern_parts.append('A')    # otherwise, add the arg to the arg strings   # and note the index if it was an option   else:     option_tuple = self._parse_optional(arg_string)     if option_tuple is None:       pattern = 'A'       else:         option_string_indices[i] = option_tuple         pattern = 'O'         arg_string_pattern_parts.append(pattern) <\/code><\/pre>\n<p>\u0422\u0443\u0442 \u0433\u0432\u043e\u0437\u0434\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u2014 protected-\u043c\u0435\u0442\u043e\u0434 <code>_parse_optional<\/code>, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0437\u0430 \u043f\u043e\u043b\u043d\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443, \u0447\u0442\u043e \u0438\u0437 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u2014 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0430 \u0447\u0442\u043e \u2014 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b. \u0415\u0441\u043b\u0438 \u043d\u0430\u0448\u043b\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435\u00a0<code>O<\/code>, \u0432\u043e \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u2014 <code>A.<\/code><\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0438 \u0437\u0430\u043f\u0443\u0442\u0430\u043d\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u043e\u0432. \u0412\u0441\u0435 \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043c\u043e\u0447\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u0435 \u0441\u0430\u043c\u044b\u0435 <code>known_args<\/code> (\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b). \u041d\u043e \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u044d\u0442\u043e\u043c \u0446\u0438\u043a\u043b\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0432 \u043d\u0435\u043c. \u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u0432\u044b\u0437\u043e\u0432 <code>Actions<\/code><em>:\u00a0<\/em><\/p>\n<pre><code class=\"python\">def take_action(action, argument_strings, option_string=None):   seen_actions.add(action)   argument_values = self._get_values(action, argument_strings)    # error if this argument is not allowed with other previously   # seen arguments, assuming that actions that use the default   # value don't really count as \"present\"   if argument_values is not action.default:     seen_non_default_actions.add(action)     for conflict_action in action_conflicts.get(action, []):       if conflict_action in seen_non_default_actions:         msg = _('not allowed with argument %s')         action_name = _get_action_name(conflict_action)         raise ArgumentError(action, msg % action_name)    # take the action if we didn't receive a SUPPRESS value   # (e.g. from a default)   if argument_values is not SUPPRESS:     action(self, namespace, argument_values, option_string) <\/code><\/pre>\n<p><em>\u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043d\u0430\u0441 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u044d\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u0430: <\/em><code>action(self, namespace, argument_values, option_string)<\/code>.<\/p>\n<p><em>\u0414\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0432\u0441\u0435 \u0432 Python \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c. \u0410 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u0441\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c, \u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u0441\u0432\u043e\u0438\u0445 \u0446\u0435\u043b\u044f\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0442\u043e\u0431\u044b\u00a0\u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u041a\u0430\u043a \u0442\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442? \u0412\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e: \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u2014 \u044d\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432\u00a0\u0440\u043e\u0432\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0438 \u043b\u044e\u0431\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b.<\/em><\/p>\n<p><em>\u041e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u2014 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 <\/em><code>action<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435\u00a0<code>take_action<\/code>. \u041f\u0440\u0438\u0447\u0435\u043c \u044d\u0442\u043e \u043d\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0430 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0439 \u043e\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u0410 \u0442\u043e\u0442, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0441\u043e\u0437\u0434\u0430\u043d \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u0430\u043a\u043b\u0430\u0441\u0441\u0430. \u042d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0434\u043e\u043b\u0433\u043e, \u043f\u043e\u0432\u0435\u0440\u044c\u0442\u0435&#8230; \u041d\u043e \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u0437\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u044e. \u0412\u00a0\u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>action<\/code> \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e\u00a0<code>_SubParsersAction<\/code>. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442,\u00a0\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043d\u0430\u00a0<code>_SubParsersAction<\/code>,\u00a0\u0431\u0443\u0434\u0435\u0442:<\/p>\n<ol>\n<li>\n<p><em>\u0441\u043e\u0437\u0434\u0430\u043d \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c\u00a0<\/em><code>new<\/code>, <\/p>\n<\/li>\n<li>\n<p><em>\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u00a0<\/em><code>init<\/code>,<\/p>\n<\/li>\n<li>\n<p><em>\u0432\u044b\u0437\u0432\u0430\u043d \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438\u00a0<\/em><code>call<\/code>. <\/p>\n<\/li>\n<\/ol>\n<p><em>\u0412\u0441\u0435 \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e, \u0435\u0441\u043b\u0438 \u0431\u044b \u0432 Python \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0438 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u0440\u0438 \u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438. \u042f, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0442\u043e\u0433\u0434\u0430 \u0438 \u043d\u0435 \u043f\u0438\u0441\u0430\u043b \u0431\u044b \u043d\u0430 \u00ab\u0425\u0430\u0431\u0440\u00bb. \u041d\u043e \u0440\u0430\u0437 \u0441\u0442\u0430\u0442\u044c\u044f \u0443\u0432\u0438\u0434\u0435\u043b\u0430 \u0441\u0432\u0435\u0442, \u0437\u043d\u0430\u0447\u0438\u0442, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u043c\u0430\u0445\u0438\u043d\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0438 \u0434\u0430\u0436\u0435 \u043d\u0443\u0436\u043d\u043e! <\/em><\/p>\n<p><em>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0445\u043e\u0440\u043e\u0448\u0438\u0439, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b \u043c\u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u0435\u0447\u044c \u0448\u043b\u0430 \u0440\u0430\u043d\u0435\u0435, \u2014 <\/em><code>parse_known_args<\/code>:<\/p>\n<pre><code class=\"python\">    def __call__(self, parser, namespace, values, option_string=None): parser_name = values[0] arg_strings = values[1:]     # set the parser name if requested     if self.dest is not SUPPRESS:         setattr(namespace, self.dest, parser_name)      # select the parser     try:         parser = self._name_parser_map[parser_name]     except KeyError:         args = {'parser_name': parser_name,                 'choices': ', '.join(self._name_parser_map)}         msg = _('unknown parser %(parser_name)r (choices: %(choices)s)') % args         raise ArgumentError(self, msg)      subnamespace, arg_strings = parser.parse_known_args(arg_strings, None)     for key, value in vars(subnamespace).items():         setattr(namespace, key, value)      if arg_strings:         vars(namespace).setdefault(_UNRECOGNIZED_ARGS_ATTR, [])         getattr(namespace, _UNRECOGNIZED_ARGS_ATTR).extend(arg_strings)  <\/code><\/pre>\n<p><em>\u041e\u043f\u044f\u0442\u044c \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0431\u0435\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432! <\/em><\/p>\n<p><strong><em>\u042f \u0431\u044b \u0445\u043e\u0442\u0435\u043b \u0434\u0430\u0442\u044c \u0432\u0430\u043c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0440\u0430\u0437\u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u043d\u0435 \u0442\u0430\u043a. \u041f\u043e\u0434\u0443\u043c\u0430\u0439\u0442\u0435 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0439\u0442\u0435 \u0447\u0438\u0442\u0430\u0442\u044c.<\/em><\/strong>*<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u043f\u0438\u0448\u0443 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0442\u0443\u0442.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0430\u0440\u0441\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0442\u0435\u043c \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>values<\/code> \u0438 \u0435\u0433\u043e \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043b\u044e\u0447\u0430 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0432 \u0441\u0435\u0431\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u043f\u0430\u0440\u0441\u0435\u0440\u0430\u0445: <code>self._name_parser_map[parser_name]<\/code>. \u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u2014 \u043e\u0431\u044a\u0435\u043a\u0442, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0439 \u0432 \u0441\u0435\u0431\u0435 <code>action<\/code> \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e (\u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e) \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430. \u0418 \u044d\u0442\u043e, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u043e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0432\u0430\u0436\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e <code>parser<\/code> \u0432 \u043d\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f <code>_StoreAction<\/code>,\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0437\u0432\u0430\u043d \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0430\u0440\u0441\u0438\u043d\u0433.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>parser.parse_known_args(arg_strings, None)<\/code>, \u043d\u043e \u0443\u0436\u0435 \u0434\u043b\u044f \u0432\u043d\u043e\u0432\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>parser. <\/code>\u0412\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>values<\/code>, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 <\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-332568","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/332568","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=332568"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/332568\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=332568"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=332568"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=332568"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}