Google 开源的 Python 命令行库:fire 实现 git 命令
off999 2024-10-26 12:03 41 浏览 0 评论
作者:HelloGitHub-Prodesire
一、前言
在前面三篇介绍 fire 的文章中,我们全面了解了 fire 强大而不失简洁的能力。按照惯例,我们要像使用 argparse、docopt 和 click 一样使用 fire 来实现 git 命令。
本文的关注点并不在 git 的各种命令是如何实现的,而是怎么使用 fire 去打造一个实用命令行程序,代码结构是怎样的。因此,和 git 相关的操作,将会使用 gitpython 库来简单实现。
为了让没读过 使用 xxx 实现 git 命令(xxx 指 argparse、docopt 和 click) 的小伙伴也能读明白本文,我们仍会对 git 常用命令和 gitpython 做一个简单介绍。
本系列文章默认使用 Python 3 作为解释器进行讲解。
若你仍在使用 Python 2,请注意两者之间语法和库的使用差异哦~二、git 常用命令
当你写好一段代码或增删一些文件后,会用如下命令查看文件状态:
确认文件状态后,会用如下命令将的一个或多个文件(夹)添加到暂存区:
然后使用如下命令提交信息:
最后使用如下命令将提交推送到远程仓库:
我们将使用 fire 和 gitpython 库来实现这 4 个子命令。
三、关于 gitpython
gitpython 是一个和 git 仓库交互的 Python 第三方库。我们将借用它的能力来实现真正的 git 逻辑。
安装:
四、思考
在实现前,我们不妨先思考下会用到 fire 的哪些功能?整个程序的结构是怎样的?
fire
git 的 4 个子命令的实现其实对应于四个函数,我们可以都放到一个类中,实现四个实例方法。而对于 git add 命令,需要接受任意个参数,在实例方法中用 *pathspecs 参数来表达。对于 git commit 命令,需要接受 -m 选项,在实例方法中用 m 参数来表达。
程序结构
程序结构上:
- 实例化 Git 对象,供全局使用
- 在 GitCli 类中定义四个命令对应的实例方法 status、add、commit、push
则基本结构如下:
下面我们将一步步地实现我们的 git 程序。
五、实现
假定我们在 fire-git.py文件中实现我们的 git 程序。
5.1 status 子命令
status 子命令不接受任何参数和选项,因此 status 方法无需任何入参。
不难看出,我们最后调用了真正的 git status 来实现,并打印了输出。
5.2 add 子命令
add 子命令相对于 status 子命令,需要接受任意个 pathspec 参数,因此 add 方法需要增加 *pathspecs 入参。fire 最终传入的是一个元组,我们需要将其转换成 list 以便后续处理。
当我们执行 python3 fire-git.py add --help 时,结果如下:
5.3 commit 子命令
commit 子命令相对于 status 子命令,需要接受 -m 选项,因此 commit 方法需要增加 m 入参。
5.4 push 子命令
push 子命令同 status 子命令一样,不接受任何参数和选项,因此 push 方法无需任何入参。
至此,我们就实现了一个简单的 git 命令行,使用 python fire-git.py status 便可查询项目状态。
非常方便的是,每个命令函数的 docstring 都将作为这个命令的帮助信息,因此,当我们执行 python3 fire-git.py --help 会自动生成如下帮助内容:
想看整个源码,请戳 fire-git.py 。
六、小结
本文简单介绍了日常工作中常用的 git 命令,然后提出实现它的思路,最终一步步地使用 fire 和 gitpython 实现了 git 程序。
对比 argparse、docopt 和 click 的实现版本,你会发现使用 fire 来实现是最简单的:
- 相较于 argparse,子解析器、参数类型什么的统统不需要关心
- 相较于 docopt,参数解析和命令调用处理也不需要关心
- 相较于 click,装饰器所定义的命令行参数信息也必须要关心
无疑,fire 把能简化的都简化了,简直就是懒人福音。
关于 fire 的讲解将告一段落,回顾下 fire 的至简之道,你会深爱上它。这也体现出了 Python 之美。
现在,你已学会了四个特点各异的主流命令行解析库的使用了,再也不需要为命令行程序的实现而烦恼了。
什么,你为要使用哪一个库而发愁?在下一篇也是最后一篇文章中,我们将对这些库做一个横向对比,以对什么场景下使用什么样的命令行库了然于胸~
『讲解开源项目系列』——让对开源项目感兴趣的人不再畏惧、让开源项目的发起者不再孤单。跟着我们的文章,你会发现编程的乐趣、使用和发现参与开源项目如此简单。欢迎留言联系我们、加入我们,让更多人爱上开源、贡献开源~
相关推荐
- windows如何进入启动项(怎么进入启动选项)
-
方法步骤如下:1.点击应用在Windows设置界面点击应用选项进入。2.选择启动在左侧分类中选择启动选项。3.点击开关点击软件后方的开关即可启动或关闭开机启动项。1、在Window的文件资...
- win11下载安装
-
一、允许安装软件1、首先点击左下角的开始按键,然后点击“settings”进入设置。2、然后点击设置中的“应用”选项。3、在点击左侧任务栏中的“应用和功能”。4、点击下拉栏,然后选择其中的“任何来源”...
- win7支持的最高配置(win7支持的最高配置是多少)
-
答案是支持win7的最高配置应该是i99900k加b365主板。 不过这套配置市面上价格偏高。这种机器比同等酷睿13代处理器的价格还要高至少一千元以上。而且就性能而言要超过i99900...
- 指令引用的内存不能为read(指令引用的0x0000000内存.该内存不能为read)
-
出现“指令引用内存不能为read”的错误可能有多种原因,包括软件冲突、驱动问题、内存质量问题等。以下是一些可能的解决方案:1.检查是否有软件冲突:尝试关闭可能冲突的软件,例如杀毒软件、优化软件等。2...
- hp1010打印机驱动程序(hp deskjet1010打印机驱动)
-
1.把光盘到电脑里然后打开光盘找到“setup.exe”双击运行。2.这里点击“不用了,谢谢,我喜欢CD安装”;下载的驱动也点这个。3.到这个一步有6个软件需要安装,不用点选直接下一步即可。4.同意服...
- 电脑黑屏怎么关机(电脑黑屏怎么关机不会伤硬盘)
-
开机按F8不动到高级选项出现在松手,选“最近一次的正确配置”回车修复,还不行按F8进入安全模式还原一下系统或重装系统(如果开机没反应,放一下电,重新插拔一下硬件,如果总是开不了机就检修一下去)。如果是...
- 应用程序无法启动0xc0000005
-
4、设备主板故障也会导致无信号,建议联系专业的维修人员上门检修。5、设备显卡手指边与手指边插槽接触不良,清理一下显卡的金手指边,重新插回去,重新固定住即可。应用程序错误0xc0000005解决方法如下...
- 移动硬盘分区方法详解(移动硬盘分区步骤)
-
1、进入管理页面将新买的移动硬盘插入计算机的USB接口,右击此电脑后选择管理。2、选择压缩卷在页面里选择“磁盘管理”,右击移动硬盘,选择“压缩卷”。3、输入压缩空间的大小输入压缩空间的大小,点击右下角...
- windows7副本不是正版影响使用吗
-
会经常弹出提示和安全警告,如果我们安装了一个非正版的windows系统,就会经常弹出此windows副本不是正版的提示,那么此windows副本不是正版有什么影响呢,其实除了视觉外,功能也会有影响。w...
-
- 100个有效qq号以及密码2025(2021最新qq号和密码大全)
-
有关QQ登记全国之最的数据目前并没有最新数据更新,最新的该项数据是截止于2019年12月的数据,接下来为大家带来QQ等级全国第一的用户的有关数据,仅供大家娱乐之用:截止2019年12月,全国qq等级第一名的名字叫做“小风波”,QQ等级高达1...
-
2026-01-13 05:51 off999
- 怎么更新ios版本(怎么更新ios版本15.0)
-
苹果系统升级到指定版本的方法:下载安装【爱思助手】,打开软件后用数据线连接iPhone和电脑。等待自动安装驱动,软件显示iPhone信息后点击左侧【下载固件】。在顶部选择手机型号,将固件类型改为【可刷...
- 免费安装电脑系统软件(免费安装电脑系统软件哪个好)
-
应该是可以的只要你舍得出钱一半来说就算是笔记本换系统去电脑城就行了不会超过50块还能给你把驱动全部打好为什么非要去苏宁装呢?朋友,你好:如果在买后一年以内,属于保修范围,装系统不收费,...
- 网络适配器消失了(空腹血糖6.0,总感觉口渴怎么办)
-
网络适配器不见了原因一:未安装网卡驱动 如果电脑的系统驱动安装包中无合适的驱动文件,导致网卡驱动未能安装,自己又不知道网卡的型号,可以先从其他地方复制一个网卡万能驱动来进行安装。电脑能够上网后,再下...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
系统u盘安装(win11系统u盘安装)
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
