Python程序员的主要工作是写命令行程序,即直接在终端运行的脚本。
随着项目规模增长,我们希望创建有效的命令行接口,通过提供不同的参数,解决不同的问题,而不是每次都修改源代码。
Click库是一个非常高效的命令行工具,能够帮助我们快速创建完美的命令行接口,小编认为这是每个Python程序员都应该掌握的工具。
- 原文出处:Medium
- 作者:Yannick
- 原文标题:perfect-command-line-interfaces-python
作为Python开发人员,我们经常编写命令行程序。例如,在我的数据科学项目中,我会在终端运行多个脚本来训练模型并评估算法的准确性。提高生产率的一个方法是定义简单和直接的命令行程序接口,对于多人参与的项目而言更是如此。
为了实现这一目标,我总结了四条原则,希望对大家有所帮助:
- 命令行参数应提供默认值
- 处理所有可能的参数错误,包括缺少参数,数据类型错误,无法找到文件等
- 撰写完善的文档,解释参数的含义以及如何设置
- 使用进度条显示长时间运行的任务
一个简单的例子
让我们将这些规则应用于一个具体的案例:一个使用Caesar cipher加密和解密消息的脚本。
假设我们编写了一个encrypt函数,如下所示。现在要创建一个的脚本来加密和解密消息。
脚本允许用户选择:模式(加密或解密),密钥。前者的默认值是加密,后者的默认值是1。这一切都通过命令行参数实现。
def encrypt(plaintext, key):
cyphertext = ''
for character in plaintext:
if character.isalpha():
number = ord(character)
number += key
if character.isupper():
if number > ord('Z'):
number -= 26
elif number < ord('A'):
number += 26
elif character.islower():
if number > ord('z'):
number -= 26
elif number < ord('a'):
number += 26
character = chr(number)
cyphertext += character
return cyphertext
初学者方法:sys.argv
脚本需要先获取命令行参数的值,让我们先用最简单的sys.argv实现。
sys.argv是一个列表,包含了用户在运行脚本时输入的所有参数(包括脚本名字本身)。
在终端输入以下指令:
> python caesar_script.py --key 23 --decrypt my secret message
pb vhfuhw phvvdjh
sys.argv列表包括:
['caesar_script.py', '--key', '23', '--decrypt', 'my', 'secret', 'message']
为了获得参数值,需要遍历参数列表,寻找一个 ‘–key’ (或 ‘-k’ )来获取密钥值,并寻找一个 ‘–decrypt’ 获取模式。
import sys
from caesar_encryption import encrypt
def caesar():
key = 1
is_error = False
for index, arg in enumerate(sys.argv):
if arg in ['--key', '-k'] and len(sys.argv) > index + 1:
key = int(sys.argv[index + 1])
del sys.argv[index]
del sys.argv[index]
break
for index, arg in enumerate(sys.argv):