对于需要许多参数的实用程序,推荐的接口是什么?

对于需要许多参数的实用程序,推荐的接口是什么?

我正在构建一个命令行实用程序,需要六条信息才能正常工作。它看起来像这样:

fm-git filename repository path comment username password

然而,在任何单独的系统上,username并且password将是恒定的。

执行该实用程序时,我发现很难构建。例如,下面是对该实用程序的一次测试调用(为了便于阅读,分成多行):

/Users/chuck/Projects/fm-git/fm-git.py chiv-lib
/Users/chuck/Projects/chiv-lib/ Chivalry/ "continued testing"
Administrator abc1234

我正在考虑通过不同的方式来传递这些论点。例如,fm-git -f filename -r repository ...fm-git --filename filename --repository repository...。我还在考虑进行usernamepassword参数配置设置,因为它们通常不会改变,然后可以从实用程序调用中删除它们。

当实用程序参数很多但又是必需的时,维持实用程序调用可读性的公认做法是什么?

答案1

通常,unix 应用程序允许多种方式来提供此信息,更“具体”的方式会覆盖不太具体的方式。

所以你有了:

  • 对于图形应用程序,所使用的工具包几乎总是提供某种方式来获取资源(例如xrdb纯 X 中的 -style 等)

  • 配置文件(如果工具包尚未提供)。

  • 命令行选项,包括短格式和长格式(getopt在 C 中很容易使用)

  • 如果没有给出信息,则合理的默认值,例如路径的当前目录

位置参数仅对少数强制参数有意义,后面可能是文件列表(因为通配符规范扩展到多个参数)。六件单独的作品太多了;该顺序很难记住,因此请使用这些选项。

对于密码,提供一种使应用程序从 stdin 读取密码的方法可能会有所帮助,可能通过使用特殊值(例如--password --p -)。

使用该应用程序的任何人都可以选择硬编码密码、配置文件中的密码或让用户输入密码是否是特定用例的最佳选择。

答案2

一般来说,最好:

  1. 计算依赖参数,但允许重新定义它们:例如,在您的示例中,您具有filename与 相同的参数$(basename repository),因此您可能只需要存储库,但可以选择--filename提供替代文件名。
  2. 从命令行和ps输出中隐藏身份验证。将它们放在某个文件中:可能是$HOME/.fm-git.conf,给文件更多限制,例如chmod 600 $HOME/.fm-git.conf从文件中读取它们。有时,它也可以从环境变量中获取用户名和密码(例如默认用户名是您的系统用户名或SUDO_USER),但可能不是您的情况。

因此,经过两次优化后,您只有 3 个 cli 参数,我认为这是可以接受的。随意使用它们作为位置参数或提供一些标志,例如--comment:如果您进一步在脚本中使用程序,提供长标志将增强可读性,但如果您主要从 cli 手动运行程序,则需要输入更多内容。

无论如何,当你用 Python 编写程序时,我建议你使用argparse模块-- 它将帮助您解析参数并在将来如果您想更改它们时进行更改。

相关内容