Python 命令行之旅:初探 docopt
Python 命令行之旅:初探 docopt
原文发表于 Prodesire 博客。
一、前言
在本系列前面四篇文章中,我们介绍了 argparse
的方方面面。它无疑是强大的,但使用方式上略显麻烦。需要先设置解析器,再定义参数,再解析命令行,最后实现业务逻辑。
而今天要介绍的 docopt 则是站在一个全新的视角来审视命令行。你可曾想过,一个命令行程序的帮助信息其实已然包含了这个命令行的完整元信息,那么是否可以通过定义帮助信息来定义命令行呢?docopt
就是基于这样的想法去设计的。
本系列文章默认使用 Python 3 作为解释器进行讲解。 若你仍在使用 Python 2,请注意两者之间语法和库的使用差异哦~
二、介绍
docopt 基于长久以来在帮助信息和手册中描述程序接口的约定,其接口描述是形式化的帮助信息。它能够根据命令行程序中定义的接口描述,来自动生成解析器。
三、快速开始
3.1 定义接口描述/帮助信息
第一步要做的就是命令行程序的定义接口描述或者是帮助信息,这样 docopt
就能知道命令行的元信息,从而自动解析。
接口描述通常定义在一个模块的文档字符串中,我们仍然以在 Python 命令行之旅:初探 argparse
的例子为例,讲解如何使用 docopt
来定义接口描述。
在 cmd.py
中,我们定义如下接口描述:
"""Num accumulator. Usage: cmd.py [--sum] <num>... cmd.py (-h | --help) Options: -h --help Show help. --sum Sum the nums (default: find the max). """
在上面的接口描述中,我们定义了命令行程序 cmd.py
接受一个或多个数字 num
,而 --sum
选项则是可选,-h
或 --help
则输出帮助信息。
若提供 --sum
,则累加给定的数字;反之,取给定多个数字中最大的一个。这个业务逻辑我们将在后文实现。
3.2 解析命令行
定义好接口描述后,就可以使用 docopt
进行解析,写法非常简单:
from docopt import docopt arguments = docopt(__doc__, options_first=True) print(arguments)
由于我们之前是将接口描述定义在模块的文档字符串中,那么直接使用 __doc__
即可获得接口描述。然后使用 docopt
函数即可解析命令行为参数字典。为了支持负数,我们将 options_first
设置为 True
。
当我们执行 python3 cmd.py --sum 1 2 3
时,将会得到如下内容:
{'--help': False, '--sum': True, '<num>': ['1', '2', '3']}
可以看到:
- 没有提供
-h
或者--help
,所以arguments
中--help
为False
- 提供了
--sum
,所以arguments
中--sum
为True
- 提供了
<num>...
为1 2 3
,所以arguments
中<num>
为['1', '2', '3']
3.3 业务逻辑
获得了解析后的命令行参数,我们就可以根据自己的业务需求做进一步处理了。
在本文示例中,我们希望当用户提供 --sum
选项时,是对给定的一组数字求和;反之则是取最大值,那么就可以这么写:
nums = (int(num) for num in arguments['<num>']) if arguments['--sum']: result = sum(nums) else: result = max(nums) print(result) # 基于上文的 python3 cmd.py --sum 1 2 3 参数,其结果为 6
3.4 代码梳理
使用 docopt
的方式非常简单,我们将上文的代码汇总下,以有一个更清晰的认识:
# cmd.py # 1. 定义接口描述 """Num accumulator. Usage: cmd.py [--sum] <num>... cmd.py (-h | --help) Options: -h --help Show help. --sum Sum the nums (default: find the max). """ from docopt import docopt # 2. 解析命令行 arguments = docopt(__doc__, options_first=True) # 3. 业务逻辑 nums = (int(num) for num in arguments['<num>']) if arguments['--sum']: result = sum(nums) else: result = max(nums) print(result)
若我们需要对一组数字求和,只需执行:
$ python3 cmd.py --sum 1 0 -1 0
若我们需要对一组数字求最大值,只需执行:
$ python3 cmd.py 1 0 -1 1
我们还可以通过 -h
或 --help
参数查看使用说明和帮助,也就是我们定义的接口描述。
四、小结
docopt
的思路非常简单,就是定义接口描述,然后帮你解析命令行为参数字典,接下来就根据这个字典来编写业务逻辑。
重点就是在于如何定义接口描述,在下一篇文章中,我们来深入了解下如何定义命令、选项、位置参数等接口描述。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Python 命令行之旅:深入 argparse(二)
Python 命令行之旅:深入 argparse(二) 原文发表于 Prodesire 博客。 前言 在上一篇“深入 argparse(一)”的文章中,我们深入了解了 argparse 的包括参数动作和参数类别在内的基本功能,具备了编写一个简单命令行程序的能力。本文将继续深入了解 argparse 的进阶玩法,一窥探其全貌,助力我们拥有实现复杂命令行程序的能力。 本系列文章默认使用 Python 3 作为解释器进行讲解。 若你仍在使用 Python 2,请注意两者之间语法和库的使用差异哦~ 帮助 自动生成帮助 当你在命令行程序中指定 -h 或 --help 参数时,都会输出帮助信息。而 argparse 可通过指定 add_help 入参为 True 或不指定,以达到自动输出帮助信息的目的。 >>> import argparse >>> parser = argparse.ArgumentParser(add_help=True) >>> parser.add_argument('--foo') >>> pars...
- 下一篇
Python 命令行之旅:使用 docopt 实现 git 命令
Python 命令行之旅:使用 docopt 实现 git 命令 原文发表于 Prodesire 博客。 一、前言 在前面两篇介绍 docopt 的文章中,我们全面了解了 docopt 的能力。按照惯例,我们要像使用 argparse 一样使用 docopt 来实现 git 命令。 为了让没读过 使用 argparse 实现 git 命令 的小伙伴也能读明白本文,我们仍会对 git 常用命令和 gitpython 做一个简单介绍。 本系列文章默认使用 Python 3 作为解释器进行讲解。 若你仍在使用 Python 2,请注意两者之间语法和库的使用差异哦~ 二、git 常用命令 当你写好一段代码或增删一些文件后,会用如下命令查看文件状态: git status 确认文件状态后,会用如下命令将的一个或多个文件(夹)添加到暂存区: git add [pathspec [pathspec ...]] 然后使用如下命令提交信息: git commit -m "your commit message" 最后使用如下命令将提交推送到远程仓库: git push 我们将使用 docopt 和 gi...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装Docker,最新的服务器搭配容器使用
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7安装Docker,走上虚拟化容器引擎之路