用 ast 重写代码;Python [英] rewriting code with ast; python

查看:28
本文介绍了用 ast 重写代码;Python的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在学习 AST,它似乎是一个强大的东西,但我很困惑代码去了哪里以及为什么它消失了.说我要重写

I am learning AST and it seems like a powerful thing but I'm confused where the code went and why it disappeared. Say I want to rewrite

example = """def fake(x):

    y = ['useless list']

    return x
"""

作为

example = """def fake(x):

    return x
"""

我看不到任何以这种方式重写的方法.我什至找不到获取行文本的方法:

I can't see any way to rewrite in this manner. I can't even find a way to get the text of the line:

In [1]: example = """def fake(x):

   ...:     y = ['useless list']

   ...:     return x
   ...: """

In [3]: import ast

In [4]: p = ast.parse(example)

In [5]: p
Out[5]: <_ast.Module at 0x7f22f7274a10>

In [6]: p.body
Out[6]: [<_ast.FunctionDef at 0x7f22f7274a50>]

In [7]: p.body
Out[7]: [<_ast.FunctionDef at 0x7f22f7274a50>]

In [8]: f = p.body[0]

In [9]: f
Out[9]: <_ast.FunctionDef at 0x7f22f7274a50>

In [10]: f.body
Out[10]: [<_ast.Assign at 0x7f22f7274b10>, <_ast.Return at 0x7f22f7274c10>]

In [11]: f.name
Out[11]: 'fake'

In [12]: newf = f.body[1:]

In [13]: newf
Out[13]: [<_ast.Return at 0x7f22f7274c10>]

In [14]: z = newf[0]

In [15]: z.value
Out[15]: <_ast.Name at 0x7f22f7274c50>

In [16]: z.value.id
Out[16]: 'x'

更令人惊讶的是它如何为您提供开头的线条,而不是结尾的线条.所以你知道一个函数从哪里开始,但不知道它在哪里结束,这是没有用的

Even more surprising is how it gives you the lineno of the start, but not the end. So you know where a function begins, but not where it ends, which is of no use

如何在没有列表 y 的情况下获取代码并重写此函数?谢谢

How can I grab the code and rewrite this func without the list y? Thank you

推荐答案

也许这对你有帮助:

import ast
import astor

example = """
def fake(x):
    y = ['useless list']
    return x
"""

tree = ast.parse(example)

# iterating through list which is represents function on ast
for ind, item in enumerate(tree.body[0].body):
    if isinstance(item, ast.Assign) and isinstance(item.value, ast.List):
        del tree.body[0].body[ind]
        break

print astor.to_source(tree)

更好地使用更多 OOP:

Better using more OOP:

class RemoveList(ast.NodeTransformer):
    def visit_FunctionDef(self, node):
        self.generic_visit(node)
        for leaf in node.body:
            if isinstance(leaf, ast.Assign) and isinstance(leaf.value, ast.List):
                del node.body[node.body.index(leaf)]
        ast.fix_missing_locations(node)
        return node


tree_class = ast.parse(example)
remove_list = RemoveList().visit(tree_class)
print astor.to_source(tree_class)

使用 RedBaron 完整语法树会更好:

from redbaron import RedBaron

example = """
def fake(x):
    y = ['useless list']
    return x
"""
red = RedBaron(example)
methods = red.find_all('DefNode').data
for data in methods:
    if len(data.value.data) > 0:
        for vals in data.value.data:
            if vals[0].type == 'assignment' and vals[0].value.type == 'list':
                index = vals[0].index_on_parent
                par = vals[0].parent
                del par[index]
                break

print red.dumps()

这篇关于用 ast 重写代码;Python的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆