0

以下が失敗する理由を誰かに教えてもらえますか:

teststr = "foo"
if not teststr.isdigit() and int(teststr) != 1:
   pass

と:

ValueError: invalid literal for int() with base 10: 'foo'

C では、&&テストの最初の部分が失敗した場合、右側は評価されなくなります。これはPythonでは異なりますか?

編集:私は愚かです。当然のandはずor…… 。

4

4 に答える 4

8

not teststr.isdigit()は True であるため、最初のテストは失敗しません。

于 2012-09-28T14:59:42.410 に答える
2
if not teststr.isdigit() and int(teststr) != 1:

として評価される

if ((not teststr.isdigit()) and (int(teststr) != 1)):

しかしteststr、数字ではないので、isdigit()false であり、(not isdigit())true です。のTrue and B場合は、B を評価する必要があります。そのため、キャストを int にしようとします。

于 2012-09-28T15:00:48.713 に答える
0

if not teststr.isdigit()int(teststr)は True であるため、要件を満たすために評価する必要がありますand- したがって例外です。

データを事前にチェックする代わりに、EAFP を利用し、次のようなものを使用します...

try:
    val = int(teststr)
    if val != 1:
        raise ValueError("wasn't equal to 1")
except (ValueError, TypeError) as e:
    pass # wasn't the right format, or not equal to one - so handle
# carry on here...
于 2012-09-28T15:00:31.597 に答える
0

おそらく使用したいコードはおそらく

try:
    int(teststr)
except ValueError:
    print "Not numeric!"

通常、あなたのように型チェックメソッドを使用するよりも、何かを試して例外をキャッチする方がよりPythonicです。

于 2012-09-28T15:08:08.150 に答える