2012-03-21 12 views
1

I持って、次の辞書:辞書GETメソッドの動作

dic = {"a": "first", "b": "second"} 

、それは大丈夫だ、私は、次の手順を実行したとき:

print dic.get("a", dic.get("c").split(" ",1)[0]) 

print dic.get("a") 
print dic.get("a", "asd") 
print dic.get("a", dic.get("c")) 

を、私はこのように、このメソッドを使用する場合

次のエラーが表示されます。

Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
AttributeError: 'NoneType' object has no attribute 'split' 

私は最後のケースを理解していません。計算された2番目の引数(dic.get( "c")はNoneでなければなりません)は、辞書にキー "a"があり、最初の引数は2番目の引数の計算を起動すべきではありません。

どうすれば修正できますか?それはなぜ起こったのですか?

TIA!

答えて

2

他の人が説明したように、Python(関数ファミリ以外のほとんどの他の言語と同様)は、関数を呼び出す前に関数のすべての引数を評価します。キー「C」は辞書に存在しないとNoneは何.split()メソッドを持っていないし、この評価は関係なく、getが成功したか失敗したか(と前に実際に)の発生したときしたがって、dic.get("c")Noneです。

代わりに、短絡ブール演算子または条件式を使用してください。

# if dic.get["a"] is always truthy when it exists 
dic.get("a") or dic.get("c", "").split(" ", 1)[0] 

# if dic["a"] could be non-truthy, e.g. empty string 
dic["a"] if "a" in dic else dic.get("c", "").split(" ", 1)[0] 
+0

私はこの方法を楽しむ!どうも! – dizpers

3

第2引数は、使用されているかどうか常に評価されます。それを修正する

あなたはアイテムが代わりにgetを使用するので見つからない場合に発生する例外をキャッチすることができます。

try: 
    result = dic['a'] 
except KeyError: 
    result = dic['c'].split(' ', 1)[0] 
print result 
+0

Thxを!それはなぜ計算されたのですか?それはPythonの機能ですか?私はそれが不合理だと思う - なぜそれが必要でないか評価する。 – dizpers

+0

@dizpers:http://stackoverflow.com/questions/9761396/dict-get-default-arg-evaluated-even-upon-successを参照してください。 –

+1

@dizpers: 'get'は他のどのような通常の方法です。Pythonインタプリタは、メソッドがどのように使用されているかを調べるのではありません。 Pythonのすべての通常のメソッド呼び出しと同様に、すべての引数はメソッド呼び出しが行われる前に評価されます。すべての引数が評価されるわけではないいくつかの状況があります。短絡を使用する特殊な 'and'と' or'演算子です。 –

2
dic.get("c") 

あなたの辞書には "c" を含んでいないので、Noneを返します。

dic.get("c").split(" ",1)[0] 

我々はdic.get("c")Noneであることを知っているので:

None.split(" ",1)[0] 

Noneにはsplitメソッドを持っていないので、あなたがそのエラーを取得する理由です。

引数はすべてメソッドに渡される前に評価されます。

+0

私はこれを理解しています。問題は - なぜこの式が計算されるのか?最初の引数はokなので、.get()メソッドは2番目の引数では機能しません。 – dizpers

+1

@dizpers - インタプリタは、関数を呼び出す前にすべての引数を知る必要があります。一部の言語では[Lazy Evalutation](http://en.wikipedia.org/wiki/Lazy_evaluation)を使用しています。これは、必要なときだけ評価するということですが、Pythonはその言語の1つではありません。 –

+0

良い答え - thx! – dizpers

3

たぶん、あなただけのタイプミスがあり、外側dic.getないインナー1の結果を分割するためのものです

print dic.get("a", dic.get("c")).split(" ",1)[0] 

を意味しました。

+0

いいえ、 "a"キーには常に空白のない値がありますが、 "c"には常にスペースがあります。 – dizpers