2017-10-07 121 views
1

我正在编写一个接受intstr类型参数的单击命令,我需要找出函数中传递的参数类型,如本例中所示:如何在Python中检查传入的CLI参数类型

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

回答

1

在点击位置参数,甚至使用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是数字,例如ü“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()

此处了解详情:Differences between isinstance() and type() in python

+0

我认为第一个例子很好地完成了这个工作,将使用num作为整数来执行投射 – MMSs

+1

更新了我的答案。使用isinstance()而不是type()。 – alexisdevarennes

0

一般认为更Python来ask for forgiveness not permission

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

这将在这里试图通过转换为inttry块来实现。如果字符串可以转换为int,那么它必须是int,否则为字符串。