为何需要参数
作为生信分析人员编写 Python 脚本的是常有的事。如果是一次性的脚本,多数情况下只需保证准确和效率即可,其他的怎么奔放怎么来。但如果是反复在同一个甚至是不同的流程中使用,就需要考虑从外部传入参数了。而当开发者和使用者不是同一个人,就需要考虑为参数提供帮助信息以及其他一些可能的高级功能。
最简单的参数只需要 sys 模块下的 sys.argv 即可,它会返回一个列表。其中索引为 0 的是脚本本身,其他元素依次为跟在脚本文件名后的其他参数。
import sys
print(sys.argv[0], sys.argv[1], sys.argv[2])
![490efed04d83d867caf914afed22d52b.png](https://i-blog.csdnimg.cn/blog_migrate/1f3909c836e647d01a0fafb941e03f91.png)
为何需要 Click
如果需要更复杂一点呢?为了使得除你之外的脚本使用者也可以正确使用,或者为了保证过了一段时间后你还能明白每个命令行参数的确切意义,就需要提供参数的帮助信息。如果有一项参数的值大多情况下为同一个特定值,但是仍然存在必须自定义的场景,就需要为参数设定默认值。这个时候 sys 模块的参数功能就远远不够用了,我们需要一款功能强大且使用简单的 Python 模块。Click 模块正是这样的选择。
几个简单的例子
本文主要起到快速入门的作用,所以用几个简单且有递进的例子带你走近 Click 模块。
一个基础的例子
import click
@click.command() # 这里表明下面的函数是一条命令
@click.option("--name") # 这里添加一个参数,当它作为下面函数的参数时忽略“--”或“-”
def say(name):
print("My name is " + name + ".")
if __name__ == "__main__":
say()
![58af67ae5fb043fe921b261e4b4de33d.png](https://i-blog.csdnimg.cn/blog_migrate/f015c2381d5637365141c3d5777f07b9.png)
加上默认值和帮助信息
import click
@click.command()
@click.option("--name", help="Your name", default="Jack") # help 参数指定帮助信息,default 参数指定“--name”参数的默认值
def say(name):
print("My name is " + name + ".")
if __name__ == "__main__":
say()
![c8f2279d16003bdb9f6eedd7219736cc.png](https://i-blog.csdnimg.cn/blog_migrate/32c80d6a4dccb5757f57d74f3d3dc8ec.png)
执行脚本时只需要添加“--help”即会输出帮助信息。
稍稍复杂一些
选项类型
选项的类型包括以下四种:str:字符,int:整数,float:浮点数,bool:布尔值。设置选项类型主要有两个好处:
一是帮助信息输出更快。当你使用“--help”输出脚本帮助信息时。如果你没有设置选项类型,Python 就会自动对类型进行推断,以便在帮助信息输出对应的类型。上文中的代码并没有设置类型,但是 Python 通过你的代码推断出参数 name 为字符类型,最终帮助信息中就显示该选项为字符类型。上中文的示例脚本极为简单,所以即使没设置选项类型,类型推断也会很快。但是,当你的脚本较为复杂时,就会消耗较长的时间进行类型推断。实际使用过程中就会体现为,使用“--help”时,脚本好一会儿才会输出帮助信息。
二是在少数情况下自动的类型推断会出现错误,于是在将选项的值传递给函数时可能就会出现问题。
显示默认值
可设置脚本在输出帮助信息时显示参数的默认值。
import click
@click.command()
@click.option("--name", help="Your name", default="Jack",
type=str, show_default=True) # type 参数指定“--name”参数的类型,show_default 设置是否显示“--name”参数的默认值。
def say(name):
print("My name is " + name + ".")
if __name__ == "__main__":
say()
![3f1f62e0ad1e86021823c88f68561db8.png](https://i-blog.csdnimg.cn/blog_migrate/9d2b87d77675127544fcc2f579a82bbe.png)
预告
本文是《基于 Click 模块开发命令行工具》系列的首篇,后续将会推出系列文章,介绍更多的进阶使用技巧。
注:各位小姐姐请注意今天的次条,这是我们鹊桥板块推荐的第一位。