开云-Google 开源的 Python 命令行库:fire 实现 git 命令

Google 开源的 Python 号令行库:fire 实现 git 号令 时候:2024-12-13 21:20:10 手机看文章

扫描二维码随时随地手机看文章

1、媒介

在前面三篇介绍 fire的文章中,我们周全领会了 fire壮大而不掉简练的能力。依照老例,我们要像利用 argparse、docopt和 click一样利用 fire来实现 git 号令。

本文的存眷点其实不在 git的各类号令是若何实现的,而是怎样利用 fire去打造一个适用号令行法式,代码布局是如何的。是以,和 git相干的操作,将会利用 gitpython库来简单实现。

为了让没读过 利用 xxx 实现 git 号令(xxx指 argparse、docopt和 click) 的小火伴也能读大白本文,我们仍会对 git经常使用号令和 gitpython做一个简单介绍。

本系列文章默许利用 Python 3 作为注释器进行讲授。若你仍在利用 Python 2,请留意二者之间语法和库的利用差别哦~
2、git 经常使用号令

当你写好一段代码或增删一些文件后,会用以下号令查看文件状况:

git status

确认文件状况后,会用以下号令将的一个或多个文件(夹)添加到暂存区:

git add [pathspec [pathspec ...]]

然后利用以下号令提交信息:

git commit -m "your commit message" 

最后利用以下号令将提交推送到长途仓库:

git push

我们将利用 fire和 gitpython库来实现这 4 个子号令。

3、关在 gitpython

gitpython[1] 是一个和 git仓库交互的 Python 第三方库。我们将借用它的能力来实现真实的 git逻辑。

安装:

pip install gitpython
4、思虑

在实现前,我们无妨先思虑下会用到 fire的哪些功能?全部法式的布局是如何的?

fire

git的 4 个子号令的实现其实对应在四个函数,我们可以都放到一个类中,实现四个实例方式。而对 git add号令,需要接管肆意个参数,在实例方式顶用 *pathspecs参数来表达。对 git commit号令,需要接管 -m选项,在实例方式顶用 m参数来表达。

法式布局

法式布局上:

实例化 Git对象,供全局利用 在 GitCli类中界说四个号令对应的实例方式 status、add、commit、push

则根基布局以下:

import os import fire from git.cmd import Gitgit = Git(os.getcwd()) class GitCli: def status(self): """ 处置 status 号令 """ pass def add(self, *pathspecs): """ 处置 add 号令 """ pass def commit(self, m): """ 处置 -m号令 """ pass def push(self): """ 处置 push 号令 """ pass if __name__ == '__main__': fire.Fire(GitCli())

下面我们将一步步地实现我们的 git法式。

5、实现

假定我们在 fire-git.py[2] 文件中实现我们的 git法式。

5.1 status 子号令

status子号令不接管任何参数和选项,是以 status方式无需任何入参。

class GitCli: def status(self): """ 处置 status 号令 """ cmd = ['git', 'status'] output = git.execute(cmd) return output

不难看出,我们最后挪用了真实的 git status来实现,并打印了输出。

5.2 add 子号令

add子号令相对 status子号令,需要接管肆意个 pathspec 参数,是以 add方式需要增添 *pathspecs入参。fire 终究传入的是一个元组,我们需要将其转换成 list 以便后续处置。

class GitCli: def add(self, *pathspecs): """ 处置 add 号令 """ cmd = ['git', 'add'] + list(pathspecs) output = git.execute(cmd) return output

当我们履行 python3 fire-git.py add --help时,成果以下:

INFO: Showing help with the command 'fire-git.py add -- --help'.NAME fire-git.py add - 处置 add 号令SYNOPSIS fire-git.py add [PATHSPECS]...DESCRIPTION 处置 add 号令POSITIONAL ARGUMENTS PATHSPECS
5.3 commit 子号令

commit子号令相对 status子号令,需要接管 -m选项,是以 commit方式需要增添 m入参。

class GitCli: def commit(self, m): """ 处置 -m号令 """ cmd = ['git', 'commit', '-m', m] output = git.execute(cmd) return output
5.4 push 子号令

push子号令同 status子号令一样,不接管任何参数和选项,是以 push方式无需任何入参。

class GitCli: def push(self): """ 处置 push 号令 """ cmd = ['git', 'push'] output = git.execute(cmd) return output

至此,我们就实现了一个简单的 git号令行,利用 python fire-git.py status即可查询项目状况。

很是便利的是,每一个号令函数的 docstring都将作为这个号令的帮忙信息,是以,当我们履行 python3 fire-git.py --help会主动生成以下帮忙内容:

INFO: Showing help with the command 'fire-git.py -- --help'.NAME fire-git.pySYNOPSIS fire-git.py COMMANDCOMMANDS COMMAND is one of the following: add 处置 add 号令 commit 处置 -m号令 push 处置 push 号令 status 处置 status 号令

想看全部源码,请戳 fire-git.py[3] 。

6、小结

本文简单介绍了平常工作中经常使用的 git号令,然后提出实现它的思绪,终究一步步地利用 fire和 gitpython实现了 git法式。

对照 argparse、docopt和 click的实现版本,你会发现利用 fire来实现是最简单的:

相较在 argparse,子解析器、参数类型甚么的十足不需要关心 相较在 docopt,参数解析和号令挪用处置也不需要关心 相较在 click,装潢器所界说的号令行参数信息也必需要关心

无疑,fire把能简化的都简化了,的确就是懒人福音。

关在 fire的讲授将告一段落,回首下 fire的至简之道,你会深爱上它。这也表现出了 Python 之美。

此刻,你已学会了四个特点各别的主流号令行解析库的利用了,不再需要为号令行法式的实现而懊恼了。

欲知详情,请下载word文档 下载文档

上一篇:开云-如何调教车模? 下一篇:开云-Google 开源的 Python 命令行库:初探 fire