2017-10-07 8 views
1

私はintstrの両方の引数を受け入れるclickコマンドを書いています。この例のように関数内で渡された引数の型を調べる必要があります:Python/Clickで渡された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が数値であるかどうかを確認するために、例えばu "123"

"isnumeric()メソッドは、文字列が数字のみで構成されているかどうかをチェックします。このメソッドはユニコードオブジェクトにのみ存在します。あなたはまた、このようにそれを行うことができ

:あなたは、後に道に沿ってNUMを使用すると、あなたはそれがint型である必要がない限り

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

しかし、これは完全に冗長です。

最後に、isinstance(num, int)ではなくtype()を使用してください。ここ

さらに詳しい情報:Differences between isinstance() and type() in python

+0

私は最初の例がうまくいくと思います。整数がnumとして使用されるようにキャストされます。 – MMSs

+1

私の答えが更新されました。 isinstance()を使用し、type()は使用しないでください。 – alexisdevarennes

0

それは一般ask for forgiveness not permissionよりPython的と考えられています。 tryブロックにintに変換しようとすることで、ここで実施される

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

。文字列をintに変換できる場合は、intでなければなりません。それ以外の場合は文字列です。

関連する問題