我们的工程团队使用Python的AST修补10,000多行代码

2021-06-07 14:21:43

导入AST#简单代码,将变量var设置为1,然后打印它。码=""" var = 1print(var)"""#将代码转换为AST。对象'头'指向AST.head = AST.Parse(代码)打印(头)

模块(body = [分配(targets = [name(id =' var' ctx = store()],expr(value = call(func = name (id =' print',ctx = load()),args = [name(id =' var' ctx = load())],关键词= []))] )

模块(Body = [Assign(targets = [name(id =' var' ctx = store()),expr(value = call(func = name (id =' print',ctx = load()),args = [name(id =' var' ctx = load())],关键词= []))] )

ImportPandasaspd MI = PD.MultiIndex.from_Product([[1,2],[' A',' B'],名称= [' x&#39 ;,' y'])打印(mi.levels [0] .name)mi = mi.set_names(" newname",level = 0)print(mi.levels [0 ]。名称)

导入astdef is_multi_index_rename_node(节点):"""检查给定节点是否表示代码:< var> .Levels [id.]。名称=< val>并返回相应的var,iDx和val如果它。 """尝试:如果(isinstance(node,ast.assign)和node.targets [0] .attr =="名称"和node.targets [0] .value.value.attr =="级别"):var = node.targets [0] .value.value.value.id idx = node.targetss [0] .value.slice.value.n val = node.value返回true,var,idx, val除:传递返回false,无,无,nonef get_new_multi_index_rename_node(var,idx,val):"""返回代表代码的AST节点:< var> =< var> .set_names(< val>,level =< id.)给给定的var,Idx和val。 """ return ast.assign(targets = [ast.name(id = var)],value = ast.call(func = Ast.Attribute(value = Ast.name(id = var),attr =" set_names&#34 ;),args = [val],关键字= [ast.keyword(arg =" level" value = ast.num(n = idx))],),)def补丁(节点):& #34;""扎根于给出节点并修补它。 """ #如果它是叶节点,则无需修补。如果不是hasattr(节点," _fields"):返回节点#的节点#,如果需要,修改它,并递归地调用它。 for(名称,字段)在AST.ITER_FIELDS(节点)中:如果ISINstance(字段,列表):对于I在范围内(LEN(字段)):检查,var,idx,val = is_multi_index_rename_node(字段[i])如果检查:字段[i] = get_new_multi_index_rename_node(var,idx,val)else:patch(字段[i])else:check,var,idx,val = is_multi_index_rename_node(字段)如果检查:setattr(节点,名称,get_new_multi_index_rename_node(var, IDX,VAL))其他:补丁(字段)

来自Intelli_Patch导入PatchImport Astimport Astunparsecode ="""导入熊猫作为pdmi = pd.multiindex.from_product([[1,2],[' a' a' a'&#39 ; B']],名称= [' x&#39 ;,' y'])mi.levels [0] .name ="新名称"&# 34;"" head = ast.parse(代码)patch(head)print(astunparse.unparse(head))

导入pandas作为pdmi = pd.multiindex.from_product([[1,2],[' a',' b']],名称= [' x' ,' y'])mi = mi.set_names('新名称' level = 0)

来自Intelli_Patch Import PatchImport Astimport Astunparsecode ="""导入熊猫作为pdclass c():def f():def g():mi.levels [0]。name ="新名称" mi = pd.multiindex.from_product([[1,2],[' a&#39 ;,#39; b']],名称= [' x&# 39;,' y'])""" head = ast.parse(代码)patch(head)print(astunparse.unparse(head))

导入pandas作为pdclass c():def f():def g():mi = mi.set_names('新名称' level = 0)mi = pd.multiindex.from_product([[1, 2],[' A&#39 ;,' B']],名称= [' x&#39 ;,' y'])

进口ASTDEF检查(节点):"""在给定节点上扎根AST并检查是否有单个字符变量名称。 """ #如果它是叶节点,则返回。如果不是hasattr(节点," _fields"):返回每个节点的每个孩子的#,检查它是否是具有单个字符#名称和递归调用它的变量。在AST.ITS_CHILD_NODE(节点)中for child_node:如果是isinstance(child_node,ast.name)和len(child_node.id)== 1:打印(f"单个字符名称' {child_node.id}&# 39;在行号{child_node.lineno}")检查(child_node)

单个字符名称' a'在线号码2single字符名称' b'在线号码3single字符名称' a'在线号码3single字符名称' b'在第4行使用

进口ASTDEF检查(节点):"""在给定节点上扎根AST,并检查除代码块外是否有未记录。 """ #如果它是叶节点,则返回。如果不是hasattr(节点," _fields"):返回#每个节点的每个孩子,检查除非代码块#和递归调用检查是否未记录。对于AST.ITER_CHILD_NODE(节点)中的child_node(node):如果是isinstance(child_node,ast.excepthandler)而不是is_logging_present(child_node):打印(f"既不是'错误' or'日志记录在除了行号{child_node.lineno}")check(child_node)def is_logging_present(node):"""扎根于给定节点的AST并检查是否有'错误'或#39;例外'伐木存在于它中。 """ #如果它是叶节点,则返回false。如果不是hasattr(节点," _fields"):返回false#如果它代表一个`错误an或`sexection`function调用,则返回true。 if(isinstance(node,ast.call)和isinstance(node.func,ast.attribute)和["错误""例外"]):返回True#递归检查是否在儿童节点中存在日志记录。对于AST.ITS_CHILD_NODES(节点)的CHILD_NODE:如果是ins_logging_present(child_node):返回true返回false

来自Unlogging_except_check导入checkimport Astcode =""尝试:passexcept值:logging.Error("发生错误")尝试:pass除了keyerror之外:logging.exception(&#34 ;除名称交易:passstry:passexcept:logging.info("信息级日志记录""" head = Ast.parse(代码)检查(头)

既不是'错误' '例外'在除块之外存在日志记录在线数字14neying 14neay'错误' '例外'日志记录存在于除行号19的块之外

Soroco致力于帮助我们的客户成为最佳状态。 我们的技术使现代企业的领导能够发现隐藏的障碍,遏制其团队和客户,并提供实现持久影响的计划,而不是暂时的福利。 Soroco的技术成立于波士顿,Soroco的技术是商业验证的,以规模构建,并在全球全球F500领导人部署。 我们的发现平台,侦察兵,单位的业务和IT利益相关者在逐步的转型之旅。 这一连接的旅程有助于加快客户的雄心勃勃的成本节约,客户体验和员工参与目标。