2017-09-27 6 views
0

私は基本的にスロットマシンとして動作するツイッチボット用のpythonスクリプトを作っています。免責事項 - 私は完全にPythonには新しく、だから私を殺さないでください。文字列が整数かどうかをテストしようとすると、スクリプトがクラッシュする

スクリプトの開始時に、正しいコマンドが入力されたかどうかをチェックし、最初の引数が整数かどうかを確認し、十分なポイントがあるかどうかを確認するコードがあります。アイデアは彼らにギャンブルする金額を選択させることです。そのため、一度手を加えるとコストラインが変更されます。

if data.IsChatMessage(): 
    if (data.GetParam(0).lower() == settings["command"] 
        and isinstance((int(data.GetParam(1).lower())), int) 
        and settings["costs"] <= Parent.GetPoints(data.User)): 

チャットからの入力は、数字であっても常に文字列形式です。私はそれをint()でintに変換することができますが、何もない場合や、数値以外に何かがあると、スクリプト全体がクラッシュします。スクリプトをクラッシュさせないで、代わりに整数を入力する必要があることをユーザーに警告するにはどうすればよいですか?ありがとう!

+1

を使用することができ、あなたは言葉で説明することができます(1).lower()))、int) 'はうまくいくでしょうか? –

+0

クラッシュはどういう意味ですか?例外はありますか?それは何ですか? – kichik

+1

整数変換コードを 'try ... except'ブロックにラップし、文字列が有効な整数を表していない場合に発生する' ValueError'例外をキャッチします。 [ここ](https://docs.python.org/3/tutorial/errors.html#handling-exceptions)を参照してください。 – user8153

答えて

2

あなたが書く:

isinstance(
    (int(data.GetParam(1).lower())), 
    int 
) 

このフラグメントには二つの問題があります。

  • あなたがint(..)コンストラクタを呼び出して、あなたはそれを非を提供する場合、その(エラー)を失敗する可能性がありますが、整数("foobar18"など)。
  • コンストラクタが成功した場合、結果はintであることが保証されているので、のチェックは役に立ちませんです。

ここで質問は何をすべきかです。文字列が実際に整数であるかどうかを調べるための高度なチェックを構築できますが、問題は複数のケースをカバーしなければならず、簡単に忘れることです。 EAFPEアシエル・P ermissionよりF orgivenessため SK

Pythonはアイデアを持つ言語です。つまり、何かが整数であるかどうかを最初に確認するよりも、Pythonの哲学が何かを試すことを奨励し、例外的にはそれを処理することを意味します。

のでウェンのようにそれを書くことができます。例えばdata.GetParam(1)ために別のエラーが発生した場合、あなたはそれ自体がそれを処理する必要はありませんので、あなたがより良いいつもあなたが(ValueError)を見ることを期待し、エラーを指定

if data.IsChatMessage(): 
    try: 
     int(data.GetParam(1).lower()) # we try it 
     isint = True # it worked! 
    except ValueError: 
     # that did not worked out very well, did it? 
     isint = False 
    if (data.GetParam(0).lower() == settings["command"] 
        and isint 
        and settings["costs"] <= Parent.GetPoints(data.User): 
     pass

それはdata.GetParam(1).lower()が整数ではないという意味ではなく、data.GetParam(1)が何らかの(他の)エラーを起こしたことを意味します。

1

私は、try/exceptブロックを使用して、ユーザーが指定した値が実際に数値であることを確認できると思います。

try: 
    i = int(string) 
    # normal execution 
except ValueError: 
    # error msg 

私はここで答えを得た: Converting String to Int using try/except in Python

1

を文字列にint型にキャストすることが可能かどうかを確認するには、単に使用します。

mystr = 'xx12' 
if mystr.isnumeric(): 
    print('YES!') 
else: 
    print('NO') 
+0

これは、Unicodeではうまく動作しない可能性があります。ドキュメントには、「数字には桁の文字と、U + 2155、VULGAR FRACTION ONE FIFTHなどのUnicode数値プロパティを持つすべての文字が含まれています。 'int(u" \ u2155 ")'は例外をスローします。 – kichik

2

場合ラインisinstance((int(data.GetParam(1).lower())), int)はとValueErrorの例外が発生しますdata.GetParam(1)は整数ではありません。

user8153がブロックを除いて、試して変換をラップし、示唆したように:あなたは `でisinstance((int型(data.GetParam考える理由

try: 
    int(data.GetParam(1)) 
    print(data.GetParam(1) + 'is an integer') 
except ValueError: 
    print(data.GetParam(1) + 'is not an integer') 

また、あなたがdata.GetParam(1).isdigit()

関連する問題