参数 — 单击文档

来自菜鸟教程
Click/docs/8.0.x/arguments
跳转至:导航、​搜索

参数

参数的工作方式与 options 类似,但具有位置性。 由于它们的语法性质,它们也只支持选项功能的一个子集。 Click 也不会尝试为您记录参数,并希望您 手动记录它们 以避免丑陋的帮助页面。

基本参数

最基本的选项是一个值的简单字符串参数。 如果没有提供类型,则使用默认值的类型,如果没有提供默认值,则假定类型为STRING

例子:

以及它的样子:


可变参数

第二个最常见的版本是可变参数,其中接受特定(或无限)数量的参数。 这可以通过 nargs 参数进行控制。 如果设置为 -1,则接受无限数量的参数。

然后将该值作为元组传递。 请注意,只能将一个参数设置为 nargs=-1,因为它会占用所有参数。

例子:

以及它的样子:

请注意,这不是您编写此应用程序的方式。 这样做的原因是在这个特定示例中,参数被定义为字符串。 然而,文件名不是字符串! 它们可能在某些操作系统上,但不一定在所有操作系统上。 有关编写此内容的更好方法,请参阅下一节。

关于非空可变参数的注意事项

如果您来自 argparse,您可能缺少将 nargs 设置为 + 以指示至少需要一个参数的支持。

这通过设置 required=True 来支持。 但是,如果您可以避免它,则不应使用它,因为我们认为如果可变参数为空,脚本应该优雅地降级为 noops。 这样做的原因是,脚本通常是使用命令行中的通配符输入调用的,如果通配符为空,它们应该不会出错。


文件参数

由于所有示例都已经使用了文件名,因此解释如何正确处理文件是有意义的。 如果命令行工具以 Unix 方式处理文件,则它们会更有趣,即接受 - 作为引用 stdin/stdout 的特殊文件。

Click 通过 click.File 类型支持这一点,它可以为您智能地处理文件。 它还可以正确处理所有 Python 版本的 Unicode 和字节,因此您的脚本保持非常可移植。

例子:

它的作用是:


文件路径参数

在前面的示例中,文件被立即打开。 但是如果我们只想要文件名呢? 最简单的方法是使用默认的字符串参数类型。 但是,请记住 Click 是基于 Unicode 的,因此字符串将始终是 Unicode 值。 不幸的是,文件名可以是 Unicode 或字节,具体取决于所使用的操作系统。 因此,类型是不够的。

相反,您应该使用 Path 类型,它会自动处理这种歧义。 它不仅会根据更有意义的内容返回字节或 Unicode,而且还能够为您执行一些基本检查,例如存在性检查。

例子:

它的作用是:


文件打开安全

FileType 类型有一个需要处理的问题,那就是决定何时打开文件。 默认行为是对其“智能”。 这意味着它将立即打开 stdin/stdout 并打开文件以供读取。 这将在无法打开文件时为用户提供直接反馈,但它只会在第一次执行 IO 操作时打开文件进行写入,通过自动将文件包装在特殊包装器中。

可以通过将 lazy=Truelazy=False 传递给构造函数来强制此行为。 如果文件被延迟打开,它将通过引发 FileError 来使第一次 IO 操作失败。

由于打开用于写入的文件通常会立即清空文件,因此只有在开发人员绝对确定这是预期行为时才应禁用惰性模式。

强制惰性模式对于避免资源处理混乱也非常有用。 如果文件以惰性模式打开,它将收到一个 close_intelligently 方法,可以帮助确定文件是否需要关闭。 这对于参数不是必需的,但对于使用 prompt() 函数手动提示是必需的,因为您不知道是否打开了像 stdout 这样的流(之前已经打开)或需要的真实文件关闭。

从 Click 2.0 开始,也可以通过 atomic=True 以原子模式打开文件。 在原子模式下,所有写入都进入同一文件夹中的单独文件,完成后,该文件将移动到原始位置。 如果修改了其他用户定期读取的文件,这将非常有用。


环境变量

像选项一样,参数也可以从环境变量中获取值。 然而,与选项不同的是,这仅支持显式命名的环境变量。

用法示例:

从命令行:

在这种情况下,它也可以是选择第一个的不同环境变量的列表。

一般不推荐使用此功能,因为它会给用户带来很多困惑。


类似选项的参数

有时,您想要处理看起来像选项的参数。 例如,假设您有一个名为 -foo.txt 的文件。 如果您以这种方式将其作为参数传递,Click 会将其视为一个选项。

为了解决这个问题,Click 会做任何 POSIX 风格的命令行脚本所做的事情,那就是接受字符串 -- 作为选项和参数的分隔符。 在 -- 标记之后,所有其他参数都被接受为参数。

用法示例:

从命令行:

如果您不喜欢 -- 标记,您可以将 ignore_unknown_options 设置为 True 以避免检查未知选项:

从命令行: