我正在编写一个接受int
和str
类型的参数的单击命令,我需要找出函数中传递的参数类型,如以下示例所示:
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
,否则为字符串。