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

时间:2017-10-07 23:48:19

标签: python python-click

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

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'>

2 个答案:

答案 0 :(得分:1)

单击或甚至使用sys.argv的位置参数将始终为str类型这是您传递给命令行的内容,字符串 < / p>

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

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&#34; 123&#34;

&#34;方法isnumeric()检查字符串是否仅包含数字字符。此方法仅存在于unicode对象上。&#34;

你也可以这样做:

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()

此处有更多信息:Differences between isinstance() and type() in python

答案 1 :(得分:0)

ask for forgiveness not permission通常认为它更像Pythonic。

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

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