1

タイトルがクレイジーに見えることはわかっていますが、本当です。これが私の苦境です。まず、私はまだ Python の初心者ですので、ご配慮ください。変数が存在するかどうかをテストしようとしています。これで、変数は yaml で解析されたファイルから取得されます。このコードを試すたびに、

if not name['foo']:
    print "No name given."
    return False

Python は期待どおりに動作し、false を返します。しかし、このコードに変更しようとすると、

try:
    name['foo']
except:
    print "ERROR: No name given."
    raise

例外は発生しません。私は検索して検索しましたが、これを説明できる質問やサイトを見つけることができませんでした. 私の唯一の考えは、パーサーが例外ハンドラーを「騙している」ということですが、それは私には意味がありません。

解析中のドキュメントの名前フィールドに空白がないことを確認しました。フィールドの形式は次のとおりです。

*name: foo
*ver: bar

私が言ったように、行間の空白とともに foo が完全に削除されたことを確認しました。誰かが助けてくれれば、それは大歓迎です。

編集:

そして、if文の負論理についてお詫び申し上げます。関数は一連のチェックを通過する必要があります。すべてのチェックが実行されたことを確認するために考えられる最善の方法は、最後に true を返し、個々のチェックが失敗した場合は false を返すことでした。

4

3 に答える 3

1

いくつかのこと:

  • それは例外をスローするべきではありません!あなたはname['foo']2つの場所で行っており、異なる動作を期待しています.

  • は辞書のnameようには動作しませんFalse。最初の例で が返されない場合は、例外が発生します。これを試してください:

    name = {}
    name['foo'] 
    

    その後、KeyError例外が発生します

  • except:ブロックは絶対にしないでください!あなたが求めている特定の例外を常にキャッチしますIndexError

于 2013-06-05T15:03:30.087 に答える
0

Python は期待どおりに動作し、false を返します。

例外 ( KeyError) は、ディクショナリにキーがない場合にのみスローされます (ディクショナリであると仮定しnameます)。もしあなたがそうするなら

if not name['foo']:

そしてそれは例外をスローしません、それはそれが入っていることを意味し"foo"ますnameが、値はブール値 false に評価されます(それは、、、FalseNoneの文字列""、空のリスト[]、空の辞書{}、カスタムオブジェクトなどになる可能性があります)。したがって、 でラップname['foo']するtry:except:のは無意味です。鍵はそこにあります。

于 2013-06-05T15:09:18.327 に答える