unix 是一种计算机操作系统,也是 linux 和 macos(以及许多其他操作系统)的祖先。在图形用户界面之前,用户通过命令行提示符与计算机进行交互(想想如今的 bash 环境)。在 unix 下开发这些程序的主要语言是 c ,它的 功能 非常强大。
因此,我们至少应该了解 c 程序 的基础知识。
假设你没有读过上面那个链接的内容,c 程序的基本架构是一个叫做 main 的函数,它的签名是这样的。
int main(int argc, char **argv) { ... }
对于 python 程序员来说,这应该不会显得太奇怪。c 函数首先有一个返回类型、一个函数名,然后是括号内的类型化参数。最后,函数的主体位于大括号之间。函数名 main 是 运行时链接器 (构造和运行程序的程序)如何决定从哪里开始执行你的程序。如果你写了一个 c 程序,而它没有包含一个名为 main 的函数,它将什么也做不了。伤心。
include #include #define optstr "b:f:" extern char *optarg; int main(int argc, char **argv) { int opt; char *bar = null; char *foo = null; while((opt=getopt(argc, argv, optstr)) != eof) switch(opt) { case 'b': bar = optarg; break; case 'f': foo = optarg; break; case 'h': default': fprintf(stderr, "huh? try again."); exit(-1); /* notreached */ } printf("%sn", foo ? foo : "empty foo"); printf("%sn", bar ? bar : "empty bar"); }
就个人而言,我希望 python 有开关,但这 永远 、永远不会 发生 。
gnu 时代
gnu 项目出现了,并为他们实现的传统 unix 命令行工具引入了更长的格式参数,比如–file-format foo。当然,我们这些 unix 程序员很讨厌这样,因为打字太麻烦了,但是就像我们这些旧时代的恐龙一样,我们输了,因为用户喜欢更长的选项。我从来没有写过任何使用 gnu 风格选项解析的代码,所以这里没有代码示例。
gnu 风格的参数也接受像 -f foo 这样的短名,也必须支持。所有这些选择都给程序员带来了更多的工作量,因为他们只想知道用户要求的是什么,然后继续进行下去。但用户得到了更一致的用户体验:长格式选项、短格式选项和自动生成的帮助,使用户不必再试图阅读臭名昭著的难以解析的 手册 页面(参见 ps 这个特别糟糕的例子)。
import click @click.command() @click.option("-f", "--foo", default="foo", help="user supplied foo.") @click.option("-b", "--bar", default="bar", help="user supplied bar.") def echo(foo, bar): """my cool program it does stuff. here is the documentation for it. """ print(foo, bar) if __name__ == "__main__": echo()
import typer cli = typer.typer() @cli.command() def echo(foo: str = "foo", bar: str = "bar"): """my cool program it does stuff. here is the documentation for it. """ print(foo, bar) if __name__ == "__main__": cli()