如何在 Python / Click 中检查传递的 CLI 参数类型



我正在编写一个接受intstr类型的参数的单击命令,我需要找出函数中传递的参数类型,如以下示例所示:

import click
@click.command()
@click.argument('num')
def command(num):
    if type(num) is int:
        click.echo("integer")
    elif type(num) is str:
        click.echo("string")
if __name__ == '__main__':
    command()

此示例不起作用,因为参数类型始终为 unicode。

$ python script.py text
<type 'unicode'>
$ python script.py 123
<type 'unicode'>

我正在寻找一种方法来使执行此命令返回以下内容:

$ python script.py text
<type 'str'>
$ python script.py 123
<type 'int'>
单击

甚至使用sys.argv中的位置参数将始终是str类型,因为这是您传递给命令行的字符串

您需要做的是解析输入并将其转换为字符串或调整代码以如下所示:

import click
@click.command()
@click.argument('num')
def command(num):
    if num.isnumeric():
        click.echo("integer")
    else:  # Will always be a str no need to check for type.
        click.echo("string")
if __name__ == '__main__':
    command()

这使用 isnumeric() 来检查传递的 str 是否是数字,例如 u"123"

"方法 isnumeric() 检查字符串是否仅由数字字符组成。此方法仅存在于 unicode 对象上。

您也可以这样做:

import click
@click.command()
@click.argument('num')
def command(num):
    if num.isnumeric():
        num = int(num)
    if isinstance(num, int):
        click.echo("integer")
    else:       
        click.echo("string")
if __name__ == '__main__':
    command()

但是,这是完全多余的,除非您打算稍后使用 num 并且您需要它是 int 类型。

最后,您应该使用isinstance(num, int)而不是type()

更多信息在这里: python 中 isinstance() 和 type() 之间的差异

通常认为请求宽恕而不是许可更像Pythonic。

try:
    int(num)
    click.echo("integer")
except ValueError:
    click.echo("string")

这将通过尝试转换为try块中的int来实现。 如果字符串可以转换为int,那么它必须是int,否则为字符串。

最新更新