2024年Python最新如何在python中使用tree sitter获得代码片段(1),2024年最新2024年春招Python面试题

(1)Python所有方向的学习路线(新版)

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

最近我才对这些路线做了一下新的更新,知识体系更全面了。

在这里插入图片描述

(2)Python学习视频

包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

在这里插入图片描述

(3)100多个练手项目

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

大模型爆火之后,很多企业都在尝试将大模型落地,尤其是以Copilot为标杆的“助手”概念率先展示了惊艳的落地感以后,大部分团队都开始研发自己的“助手”——一种“问什么答什么,甚至帮你做一些”的角色。这一概念被各个大小团队结合到自己的产品之中,搜索的助手、购物的助手、编程的助手…人们逐渐发现,要当好一个助手,或者说能给风格迥异的用户中任何一位当好助手,他必须具备应对各种问题的“知识”。目前,这种知识的灌输主要有两个思路,一种是训练(靠脑子记住),一种是外挂知识库(靠翻参考书)。

随着开源大模型能够允许的窗口越来越大,不仅仅是对话的轮次能够变长(说实话,如果较少的轮次能够解决问题,没人会更喜欢一直沟通),更重要的是,RAG(retrieval augmented generation)路线中模型能够输入的信息片段越来越多。一方面现在都追求落地,在已有的产品上落地,运用过去已经积累的数据,或让AI来使用自己过去形成的经验,把人在解决某个问题需要的知识放在AI面前,让AI做选择、组合、创造,比让AI自己憋出一个答案要简单,是非常直观的想法;另一方面是RAG的可控感比训练要强的多,大部分我这样的小白对于这种超大模型数十百亿神经元的训练,用一种“历史是螺旋上升”的感觉来说,和早期的机器学习“炼丹”没什么不同。

闲话少说,在代码补全方面,我们也很直观地会想,有的用户的代码是相似的,如果有别人的代码做参考,AI就能更接近正确答案;有的函数的实现、类的定义对于当前生成位置而言是必须的,如果能补充给AI看到,那么AI就更可能使用正确的属性、填入正确的参数、使用正确的方法。而代码的片段,通常有两种获取思路,一种是暴力切割,几行一切或者多少个字符一切,这样做的缺点是,这样得到的片段不一定都是语义完整的,多个片段拼在一起不通顺,和AI在预训练阶段见到的数据大概率不同,如果自己额外用新的片段式输入SFT,可能会浪费预训练模型的超强语义理解能力。而另一种方法,就是以代码解析器能够解析的一个单元进行划分,这样保证每个片段都是语义完整的,可以轻松地用注释或者什么将它们连接在一起,构成的新的代码全文甚至可以再次被代码解析器解析,这更加符合“代码”的本意。

而这个获得代码片段的环节,离不开tree-sitter这类代码解析工具的使用,我在初接触时因为也有不少困惑,因此分享一些学习笔记,帮类似情况的小伙伴减轻痛苦。

什么是tree-sitter & 为什么选择 tree-sitter

tree-sitter是一个C语言编写的代码解析工具,简单来说就是把一个代码片段,解析成一个树结构,通过父节点、子节点的层级关系来展现代码的层级关系,比如一个函数体 -> 函数体中的一句变量声明,通过子节点、兄弟节点的同级关系来展现代码中并列同一层级的结构。因此,我们可以从tree-sitter解析出的树上(Abstract Syntax Tree简称AST)取某个节点,它就是一个完整的片段,比如取一个花括号包裹的函数体、取一个if语句、取一个while循环…,这比基于正则表达式或其他字符串处理策略去获取函数片段(在代码生成RAG的方案中经常看到的code snippet)会方便得多。

tree-sitter的支持非常广,基本上可以解析任何编程语言,并且也非常快,即便对于有语法错误的代码片段也能完成解析,鲁棒性高,因为是纯C语言编写的,基本也没有什么依赖,所以一直是很多RAG代码生成方案所选择的代码片段化工具,比如TabbyML(一个开源的对标copilot的插件产品,能够和开源的代码生成模型结合使用)

tree-sitter如何使用

因为tree-sitter是C编写的,其他语言比如Python通常会使用python bindings的方式使用这样的C语言工具包中的函数(language bindings可以理解为,有一些这个语言内置的库,可以把python里的数据结构转换为目标工具库语言的数据结构,这样就可以传参传进那些函数里),同时,这样的其它语言的库使用时要load进python程序中,通常会通过.so文件来完成导入,后面会讲到。

1. 基本配置

首先需要获得你要解析的目标语言的“语法知识”,比如python需要python对应的知识、javascript需要javascript对应的知识。获得的途径有两个(建议去github搜 {语言} tree-sitter 就可以看到readme里的教程),以python为例

  • 第一种是直接通过pip install (推荐)
pip install tree-sitter, tree-sitter-python

import tree_sitter_python as tspython
from tree_sitter import Language, Parser

PY_LANGUAGE = Language(tspython.language(), "python")

  • 第二种是通过源文件编译出.so文件(这种可能在你的语言比较冷门、对应的包更新不勤快的时候用比较好)

首先保证自己的电脑上装有C编译器(一般windows下载了 Visual Studio就okay),在github上找到对应知识的实现,拉取

git clone https://github.com/tree-sitter/tree-sitter-python

接下来写一个小脚本,对它进行编译,获得的.so文件就是解析目标语言所需的“知识”了

from tree_sitter import Language, Parser

Language.build_library(
    # Store the library in the `build` directory
    "build/my-languages.so",
    # Include one or more languages
    ["vendor/tree-sitter-go", "vendor/tree-sitter-javascript", "vendor/tree-sitter-python"],
)

这个.so文件的位置要记住,每次在代码里使用都要先加载它

PY_LANGUAGE = Language("build/my-languages.so", "python")

2. parser的使用

完成配置后,就可以把这个“知识”装载到parser中,接着就可以用parser来解析代码了。

parser = Parser()
parser.set_language(PY_LANGUAGE)

通常来说,我们掌握解析字符串类型的代码内容就够了,如果有其他的数据类型的代码,也可以传递一个read的方法到parser的parse函数里(具体参考官方github的官方仓库吧)。注意,parser是基于bytes工作的,所以我们需要先把字符串类型转换为bytes,之后node内容的解析等都要记住在bytes上操作

code = f'{所有代码内容}'
src = bytes(code, 'utf8')
tree = parser.parse(src)

这样就很轻易地获得解析完的语法树了,是一个形如这样的结构,子节点我用缩进表示,兄弟节点就是同一层缩进的

program
	comment
	export statement
	...
	

AST的使用场景

获得这样一棵语法树之后,通常会有以下几种使用场景

1. 看看树里的每个node是什么,以及node在代码原文中对应的片段是什么

这里要注意两个概念

  • node type:解析代码的时候实际上会对各种代码片段归类,比如说“statement block”这种node type,通常表示一个由花括号包裹的片段,不管是if,while还是函数体的花括号,里面可能都会包含一个子节点,它的node type都是"statement block"。
  • node text:每个node都会对应代码原文中的一段,父节点对应的片段会包含子节点对应的片段。注意,parser是在bytes上运作的,所以我们想要还原字符串的时候,还要从bytes还原回来:src_bytes[cursor.node.start_byte: cursor.node.end_byte].decode('utf-8')

举一个遍历语法树,打印node type 和 node text的例子

def display\_tree(src_bytes, cursor, ident=4, node_text=True):
    '''
 display syntax node of the tree and its corresponding text

 Args:


### 最后

> **🍅 硬核资料**:关注即可领取PPT模板、简历模板、行业经典书籍PDF。  
> **🍅 技术互助**:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。  
> **🍅 面试题库**:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。  
> **🍅 知识体系**:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值