{"id":626,"date":"2020-02-19T01:13:20","date_gmt":"2020-02-18T17:13:20","guid":{"rendered":"http:\/\/www.mustenaka.cn\/?p=626"},"modified":"2020-02-19T01:15:19","modified_gmt":"2020-02-18T17:15:19","slug":"funnycode-letpythonadddefine","status":"publish","type":"post","link":"https:\/\/www.mustenaka.cn\/index.php\/2020\/02\/19\/funnycode-letpythonadddefine\/","title":{"rendered":"\u4e3aPYTHON\u6dfb\u52a0define\u529f\u80fd\u3010\u641e\u7b11\u4ee3\u7801\u3011"},"content":{"rendered":"<p>\u5076\u7136\u95f4\u5728CSDN\u4e0a\u9762\u770b\u5230\u4e86\u8fd9\u4e2a\u4ee3\u7801\uff0c\u771f\u7684\u662f\u4ec0\u4e48\u56de\u8def\u65b0\u5947\u7684\u4ee3\u7801\u90fd\u6709\u554a<\/p>\n<pre class=\"pure-highlightjs\"><code class=\"\" python=\"\">import pprint\r\nimport os\r\nimport ast\r\nimport astunparse\r\nSUFFIX_FILE_NAME = \"_con_\"\r\nSPLIT_LINE_SHOW = \"*\" * 30\r\n \r\nCONST_DEFINE = \"\"\"\r\n    #define True 1\r\n    #define False 0\r\n    #define_attr switches.IS_SERVER 1\r\n    #define_attr switches.IS_CLIENT 0\r\n\"\"\"\r\n \r\n \r\nclass NodeVisitDefine(ast.NodeTransformer):\r\n    \"\"\"\r\n    \u8282\u70b9\u8f6c\u6362\u5668\r\n    \"\"\"\r\n    def __init__(self):\r\n        super(NodeVisitDefine, self).__init__()\r\n        self.const_define_dict = dict()\r\n        self.attr_define_dict = dict()\r\n        for one_define in CONST_DEFINE.split(\"\\n\"):\r\n            one_define = one_define.lstrip()\r\n            define_keys = one_define.split(\" \")\r\n            if define_keys[0] == \"#define\":\r\n                self.const_define_dict[define_keys[1]] = eval(define_keys[2])\r\n            if define_keys[0] == \"#define_attr\":\r\n                self.attr_define_dict[tuple(define_keys[1].split(\".\"))] = eval(define_keys[2])\r\n \r\n        print SPLIT_LINE_SHOW\r\n        print \"computer const dict:\"\r\n        pprint.pprint(self.const_define_dict)\r\n        print SPLIT_LINE_SHOW\r\n        print \"computer attr dict:\"\r\n        pprint.pprint(self.attr_define_dict)\r\n        print SPLIT_LINE_SHOW\r\n \r\n    def generic_visit(self, node):\r\n        super(NodeVisitDefine, self).generic_visit(node)\r\n        if type(node) is ast.Name:\r\n            if type(node.ctx) is ast.Load:  # \u52a0\u8f7d\u53d8\u91cf\r\n                if node.id in self.const_define_dict:\r\n                    define_val = self.const_define_dict[node.id]\r\n                    if isinstance(define_val, basestring):\r\n                        return ast.Str(s=define_val)\r\n                    elif isinstance(define_val, (int, float)):\r\n                        return ast.Num(n=define_val)\r\n        if type(node) is ast.Attribute:\r\n            print ast.dump(node)\r\n            attr_list = list()\r\n            attr_list.append(node.attr)\r\n            tmp_node = node\r\n            while type(tmp_node.value) is ast.Attribute:\r\n                tmp_node = tmp_node.value\r\n                attr_list.append(tmp_node.attr)\r\n            else:\r\n                if type(tmp_node.value) is ast.Name:\r\n                    attr_list.append(tmp_node.value.id)\r\n            attr_list.reverse()\r\n            if tuple(attr_list) in self.attr_define_dict:\r\n                define_val = self.attr_define_dict[tuple(attr_list)]\r\n                if isinstance(define_val, basestring):\r\n                    return ast.Str(s=define_val)\r\n                elif isinstance(define_val, (int, float)):\r\n                    return ast.Num(n=define_val)\r\n        return node\r\n \r\n \r\ndef convert_one_file(dir_name, file_name):\r\n    \"\"\"\r\n    \u8f6c\u6362\u4e00\u4e2a\u6587\u4ef6\r\n    :param dir_name:\r\n    :param file_name:\r\n    :return:\r\n    \"\"\"\r\n    if file_name.split(\".\")[0][-len(SUFFIX_FILE_NAME):len(file_name)] == SUFFIX_FILE_NAME:\r\n        print \"skip file:%s ...\" % file_name\r\n        return\r\n    print \"convert file: %s ....\" % file_name\r\n    ori_file = \"%s%s%s\" % (dir_name, os.sep, file_name)\r\n    with open(ori_file, \"r\") as ff:\r\n        src = ff.read()\r\n        ast_node = ast.parse(src, file_name)\r\n    if ast_node is None:\r\n        print \"convert file:%s failed!\" % file_name\r\n        return\r\n    con_file_name = \"%s%s.py\" % (file_name.split(\".\")[0], SUFFIX_FILE_NAME)\r\n    new_file = \"%s%s%s\" % (dir_name, os.sep, con_file_name)\r\n    if os.path.exists(new_file):\r\n        os.remove(new_file)\r\n    with open(new_file, \"w\") as ff:\r\n        con_node = NODE_CONVERTER.visit(ast_node)\r\n        astunparse.Unparser(con_node, ff)\r\n \r\n \r\ndef convert_one_dir(dir_name):\r\n    \"\"\"\r\n    \u8f6c\u6362\u4e00\u4e2a\u76ee\u5f55\r\n    :param dir_name:\r\n    :return:\r\n    \"\"\"\r\n    for dir_path, _, file_names in os.walk(dir_name):  # \u904d\u5386\u6587\u4ef6\r\n        print \"convert dir: %s ....\\n\" % dir_path\r\n        for file_name in file_names:\r\n            convert_one_file(dir_path, file_name)\r\n \r\n \r\nNODE_CONVERTER = NodeVisitDefine()\r\n \r\n \r\nif __name__ == \"__main__\":\r\n \r\n    dir_split = os.sep  # \u8def\u5f84\u5206\u9694\u7b26\r\n    con_files_dir = [\r\n        \".\/opt_module\"\r\n    ]  # \u9700\u8981\u8f6c\u6362\u6587\u4ef6\u7684\u8def\u5f84\r\n    for one_dir in con_files_dir:\r\n        one_dir = one_dir.replace(\"\/\", dir_split)\r\n        convert_one_dir(one_dir)\r\n<\/code><\/pre>\n<p>\u901a\u8fc7Ast\u6a21\u5757\u7684\u66ff\u6362\u8282\u70b9\u529f\u80fd<\/p>\n<p>\u5728 CONST_DEFINE\u00a0\u53d8\u91cf\u4e2d\u5b9a\u4e49\u9700\u8981\u66ff\u6362\u7684 \u5e38\u91cf\u00a0\u548c \u5c5e\u6027\u5b9a\u4e49\uff0c\u53ef\u4ee5\u907f\u514dpython\u8fd0\u884c\u671f\u6c42\u503c\u51cf\u6162\u901f\u5ea6\u3002<\/p>\n<p>\u4f20\u5165\u9700\u8981\u5904\u7406\u7684\u5305\u7684\u76ee\u5f55\u8def\u5f84\uff0c\u5373\u53ef\u8f93\u51fa\u8f6c\u6362\u540e\u7684\u6587\u4ef6\u3002<\/p>\n<blockquote><p>\u539f\u6587\u5730\u5740\u8fde\u63a5https:\/\/blog.csdn.net\/weixin_42092782\/article\/details\/84899772<\/p><\/blockquote>\n<p>\u4e2a\u4eba\u60f3\u6cd5\uff1a<\/p>\n<blockquote><p>\u53ef\u4ee5\u5229\u7528python\u81ea\u5e26\u7684 &#8220;True&#8221; : &#8220;Ture&#8221; \u7684\u65b9\u5f0f\u521b\u5efa\u66f4\u591a\u7684\uff0c\u8fd9\u6837\u5c31\u662f\u4e00\u4e2a\u7b26\u5408python\u8bed\u6cd5\u7684\u3010\u5b8f\u5b9a\u4e49\u4e86\u3011<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>\u8ba9PYTHON\u652f\u6301#define<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[30],"tags":[31],"class_list":["post-626","post","type-post","status-publish","format-standard","hentry","category-python","tag-python"],"views":2939,"_links":{"self":[{"href":"https:\/\/www.mustenaka.cn\/index.php\/wp-json\/wp\/v2\/posts\/626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mustenaka.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mustenaka.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mustenaka.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mustenaka.cn\/index.php\/wp-json\/wp\/v2\/comments?post=626"}],"version-history":[{"count":1,"href":"https:\/\/www.mustenaka.cn\/index.php\/wp-json\/wp\/v2\/posts\/626\/revisions"}],"predecessor-version":[{"id":627,"href":"https:\/\/www.mustenaka.cn\/index.php\/wp-json\/wp\/v2\/posts\/626\/revisions\/627"}],"wp:attachment":[{"href":"https:\/\/www.mustenaka.cn\/index.php\/wp-json\/wp\/v2\/media?parent=626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mustenaka.cn\/index.php\/wp-json\/wp\/v2\/categories?post=626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mustenaka.cn\/index.php\/wp-json\/wp\/v2\/tags?post=626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}