2

だから私は次のコードを持っています:

user_input = raw_input("Enter an integer, string or float:")
input_type = type(user_input)

if input_type == "str":
    print "Your string was %s." % user_input

elif input_type == "int":
    input_type = int(input_type)
    print "Your integer was %d." % user_input

elif input_type == "float":
    input_type = int(input_value)
    print "Your float was %d." % user_input

else:
    print "You did not enter an acceptable input."

これは機能しません— のせいだと思いますif— だから私はそれを次のように変更しました:

if "str" in input_type

floatと"int"integer の場合、エラーが発生します。

Traceback (most recent call last):
File "types.py", line 4, in <module>
if "str" in input_type:
TypeError: argument of type 'type' is not iterable

なぜこれが発生し、どうすれば修正できますか?

4

5 に答える 5

13

ここには多くの問題があります。


user_input = raw_input("Enter an integer, string or float:")
input_type = type(user_input)

raw_input常に文字列を返すので、input_type常にstrここにあります。


if input_type == "str":
    print "Your string was %s." % user_input

input_typeつまり、文字列型をstr表す実際のオブジェクトであり"str"、単なる文字列である ではありません。したがって、これは決して真実ではなく、他のテストも真実ではありません。


これを次のように変更します。

if "str" in input_type:

input_type…文字列のコレクション、または"str"その途中にある長い文字列のいずれかであると予想しない限り、おそらく何も役に立ちません。そして、なぜあなたが期待するのか想像もつきません。


これらの行:

input_type = int(input_type)

… を変換しようとしてinput_typeいます — これは、またはのようなであり、値ではありません — を整数に変換しようとしています。それはあなたが望むものではありません。strint


これらの行:

print "Your integer was %d." % user_input

に変換したものではなく、ユーザーから受け取った元の文字列を出力していますint。これは%sではなくを使用した場合に機能します%dが、おそらくあなたがしようとしていたことではありません。


print "Your float was %d." % user_input

%d前の問題を修正しても、フロートの印刷には使用できません。


次に、型を比較して物事をテストすることは、ほとんどの場合、悪い考えです。

本当に必要な場合は、ほとんどの場合、isinstance(user_input, str)notを使用することをお勧めしますtype(user_input) == str

しかし、あなたはそれをする必要はありません。


実際、一般的には「許可よりも許しを請う」方が適切です。何かを整数に変換できるかどうかを調べる正しい方法は、それを整数に変換してみて、変換できない場合は例外を処理することです。

try:
    int_value = int(user_input)
    print "Your integer was %d." % int_value
except ValueError:
    # it's not an int
于 2013-06-27T01:27:23.493 に答える
0

これは真の重複ではないと思いますが、Python の isinstance() と type() の違いには非常に関連性の高い回答が含まれており、読むのに適しています。

最終的にtry/exceptは、データを適切に処理する を作成する必要があります。

if isinstance(user_input, str): #or basestring, if you prefer, but Python 3 apparently doesn't use it
    useThisLikeAString(user_input)
try:
    intInput = int(user_input)
    useThisLikeAnInt(user_input)
except TypeError:
    useThisLikeSomethingElse(user_input)

言い換えれば、受け入れられた答えは完全に正しいですが、その議論へのリンクは価値があります.

于 2013-06-27T15:21:05.327 に答える
0

isinstance次のように、コードを使用しinputて、期待どおりの動作をさせる必要があります。

user_input = input("Enter an integer, string or float:")

if isinstance(user_input, str):
    print "Your string was %s." % user_input
elif isinstance(user_input, int):
    print "Your integer was %d." % user_input
elif isinstance(user_input, float):
    print "Your float was %f." % user_input
else:
    print "You did not enter an acceptable input."

raw_input常に文字列を返します。

を使用する場合inputは、文字列入力の前後に ' または " を含める必要があります。また、input非常に危険なため、このような使用は絶対に行わないでくださいtry except。abarnert によって提案された方法を使用してください。

于 2013-06-27T01:26:28.203 に答える