2010-11-19 11 views
5

3つのパラメータを取るpythonスクリプトを作成したいと思います。最初のパラメータは文字列、2番目のパラメータは整数、3番目のパラメータも整数です。Python:引数が整数かどうかをテストする

私は適切な数の引数が提供されていることを確認するために開始時に条件付きチェックを入れたい、と彼らは先に進む前に右のタイプです。

私たちは引数リストを取得するにはsys.argvのを使用することができます知っているが、私は、パラメータを使用するために私のローカル変数に代入する前に、整数であることをテストする方法がわかりません。

ご協力いただければ幸いです。

+1

を掲載しましたか? – Zeke

答えて

8

あなたは、Python 2.7を実行している場合、argparseをインポートしてみてください。 Python 3.2もそれを使用し、引数を解析する新しい方法です。

パイソンdocumentation pageからこのサンプルコードでは、int型のリストを取り込み、最大または渡された数字の合計のいずれかを発見します。

import argparse 

parser = argparse.ArgumentParser(description='Process some integers.') 
parser.add_argument('integers', metavar='N', type=int, nargs='+', 
        help='an integer for the accumulator') 
parser.add_argument('--sum', dest='accumulate', action='store_const', 
        const=sum, default=max, 
        help='sum the integers (default: find the max)') 

args = parser.parse_args() 
print(args.accumulate(args.integers)) 
1
>>> int('foo') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: 'foo' 

intにそれを与えます。 ValueErrorが発生しない場合、文字列は整数です。

6

Pythonの方法は、入力が

try: 
    sys.argv = sys.argv[:1]+map(int,sys.argv[1:]) 
except: 
    print 'Incorrect integers', sys.argv[1:] 
+1

+1 EAFPとしても知られています:http://docs.python.org/glossary.html#term-eafp –

+0

私はこの構造体( 'except TypeError')を使用しましたが、値の' TypeError'としてキャッチしませんでした。 1x'。 ValueError:基数10のint()に無効なリテラルがあります: '1x'。ですから、私は正式に 'except'ジェネリックを作る答えを編集します。 – amphibient

+0

python 3.4+に含めるべき 'print'カッコを除いて、上記' try'ブロックをpython 3.4+のように使うことができますか? ----私はエラーが出る、それは私がリストに 'map'を連結することはできないと言います。その結果、テストは常に例外句にジャンプします。 Cheers、 – Cbhihe

0

のような操作をサポートしていない場合は、引数をキャストし、ValueErrorを除いて...試すことができますしようとすると失敗することがあります。

sys.argvを使用している場合は、argparseも調べてください。文字列が数字のみで構成されている場合

3

typeを使用して、Pythonで任意のオブジェクトのタイプを判別できます。これはPython 2.6で動作しますが、他のバージョンに存在するかどうかは個人的にはわかりません。より一般的に

obvious_string = "This is a string." 
if type(obvious_string) != int: 
    print "Bro, that is so _not_ an integer." 
else: 
    print "Thanks for the integer, brotato chip." 
+3

この問題は、sys.argvを介して渡されるすべての引数が定義文字列であること、つまりポスターが知る必要があることは「この引数をintに変換することはできますか? argparseを使用しない場合、最良の方法はtry/exceptブロック内で変換を試みることです(別のところで述べたように)。 – bgporter

+0

もっと知るほど.. – Zack

9

、あなたは何かがクラスのインスタンスであるかどうかを確認するためにisinstanceを使用することができます。明らかに

は、スクリプトの引数の場合には、すべてのものは文字列ですが、関数/メソッドに引数を受け取り、それらをチェックしたい場合は、使用することができます:

def foo(bar): 
    if not isinstance(bar, int): 
     bar = int(bar) 
    # continue processing... 

ます。また、渡すことができますクラスのタプルがでisinstanceする:

isinstance(bar, (int, float, decimal.Decimal)) 
+0

このケースには該当しません。すべてのcmd-line引数は文字列として受け取ります。しかし、私は誰かがtinstellをisinstanceに渡すことができるのか分からなかったので、ありがとう - 私は学んだ。 –

2

私はこれが助けたことも助けることがないようにだけ掲載していますので、私は、Pythonに新しいです:私のアプローチがある理由についてのコメントを取得/ことを、最高のものではありませんです。

だから、私は経験豊富なのpython devのないです免責条項で、ここで私はどうなるのかです:

inp = sys.argv[x] 
try: 
    input = int(inp) 
except ValueError: 
    print("Input is not an integer") 

何上記ませんが、それはその後、[x]はInPにsys.argvのを置き、ということです整数型のinpを入力しようとします。整数形式のinpがない場合、inpは数値ではないため、ValueError例外が発生します。

私はそれをあなたの主な問題とし、3つのパラメータがすべて正しい形式であるかどうかを確認する方法を知っています。そうでない場合は、私たちに知らせてください。あなたはもっと答えが得られると確信しています。 :)

だけで実現Tony Veijalainenは、実行しているのPythonのバージョンは何similar answer

関連する問題