在python代码中构建术语用法索引 简本

在python代码中构建术语用法索引 简本,python,abstract-syntax-tree,documentation-generation,Python,Abstract Syntax Tree,Documentation Generation,我有一套python代码(教学材料的一部分)。我想建立一个索引,记录何时使用各种python关键字、内置项和运算符(特别是:何时首次使用它们)。使用ast获得适当的标记化有意义吗?是不是太过分了?有更好的工具吗?如果不是,则ast代码会是什么样子?(我读过文档,但从未使用过ast) 澄清:这是关于为python源代码编制索引,而不是讨论python的英文文本 背景 我的资料是以ipython笔记本的形式提供的,所以即使我有一个索引工具,我也需要做一些编码来获得源代码。我没有索引工具;谷歌搜索“p

我有一套python代码(教学材料的一部分)。我想建立一个索引,记录何时使用各种python关键字、内置项和运算符(特别是:何时首次使用它们)。使用
ast
获得适当的标记化有意义吗?是不是太过分了?有更好的工具吗?如果不是,则
ast
代码会是什么样子?(我读过文档,但从未使用过
ast

澄清:这是关于为python源代码编制索引,而不是讨论python的英文文本

背景 我的资料是以ipython笔记本的形式提供的,所以即使我有一个索引工具,我也需要做一些编码来获得源代码。我没有索引工具;谷歌搜索“python索引”并没有显示任何与“索引”的预期含义相符的内容

我想,“这是一个简单的任务,让我们为整个事情写一个脚本,这样我就可以完全按照我想要的方式来做。”。但我当然想把它做好

哑解决方案:读取文件,在空格和单词边界上标记,索引。但是字符串的内容会使这一点变得混乱(什么时候真正第一次引入了
for
),当然,附加的运算符并没有分开:
text+=“this”
将标记为
[“text”,“+=”,“this”]

下一个想法:我可以使用
ast
解析文件,然后遍历树并为我看到的内容编制索引。这似乎涉及到
ast.parse()
ast.walk()
。类似这样的内容:

for source in source_files:
    with open(source) as fp:
        code = fp.read()
        tree = ast.parse(code)
        for node in tree.walk():
           ... # Get node's keyword, identifier etc., and line number-- how?
               
           print(term, source, line)   # I do know how to make an index
那么,这是一种合理的方法吗?有更好的方法吗?应该如何做呢?

您是单独搜索“索引”还是搜索“索引工具”?我认为您的主要问题是将语言概念与其自然语言使用区分开来

我想您在这里的主要困难不是遍历文本,而是在模式匹配中找到这些东西。例如,您如何识别引入For循环?这将是单词loop的“near”一词,并很快使用For命令“以后。该命令将是一行,以for开头,以冒号结尾

这只是一种模式,尽管有很多变化。然而,考虑一下如何区别于列表理解,以及从一代理解(显式和内建)来区分。

你会直接输入吗?我认为主题和关键字列表是必要的,并非所有的主题和关键字都在语言的终端标记中——尽管完整的BNF语法可能会包含它们


<>你会考虑一个标记索引工具吗?有时,在每个关键点上手工做标记,然后让标记工具从中提取索引更容易。这种工具已经存在至少30年了。通过搜索“索引工具”,在搜索中添加“标记”或“标记”,也可以找到这些工具


明白了。我以为您想解析这两个,使用代码作为介绍的主键。我的错误。与技术交流协会接触过多。:-)

是的,AST是过度杀伤力——在内部。从外部看——它是有效的,它会给你一个包含那些关键的非终端标记(比如“列表理解”)的树,并且很容易得到一个BNF和输入文本


这将为您提供解析树的顺序列表。编码将包括遍历树,从输入列表中为每个新概念建立索引。找到每个概念后,对实例进行索引,将其从输入列表中删除,然后继续,直到样本代码或输入项用完。

关于“索引”的观点很好,我没有想到这一点。但是我发现我没有完全清楚地表明我想要为python代码编制索引(不是英文文本,但愿如此——这是一个完全不同的任务)。只要我的解析器知道不要查看文本文档字符串之类的内容,识别关键字就很简单了。像理解这样的东西更难识别,但对于它们,我可以只扫描文本(我知道怎么做,这不是问题的一部分)。我希望问题现在更清楚了。也许我应该问一下如何使用
ast
进行标记化……谢谢!但我不必为所有python提供自己的BNF,对吗?我认为它内置了
ast
。你能提供一个代码片段吗?在构建索引方面我不需要任何帮助,但是如何处理
ast.walk()
返回的(大概是)节点呢?我看了文件,他们。。。复杂,对不起;我没有和ast合作过,只是一些概念。我的工作是使用混合BNF进行多语言解析。“我如何使用”需要更多的定义——您的伪代码是什么,您在实际编码方面取得了多大进展?设计讨论不应该有这么多问题——去聊天吧?至于复杂,我认为节点格式是由输入语法设计的。我们需要为您确定要定位的字段和值,只需在节点流中搜索这些字段和值。生成器管道应该做到这一点——一旦设计是可靠的。但我的问题是代码问题,而不是设计问题:-)我将在问题中添加框架代码,为什么不呢。它将阻止其他人尝试帮助处理基本的python内容。谢谢你的帮助!谢谢你的提醒,但我还没有最喜欢的答案。