2013-05-14 10 views
6

タプルまたはNoneを返す関数があります。呼び出し元はどのようにその状態を処理する必要がありますか?Python関数から返された空の(none)タプルを扱う方法

def nontest(): 
    return None 

x,y = nontest() 

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
TypeError: 'NoneType' object is not iterable 
+3

可能な場合は、呼び出された関数を変更して常にタプルを返します。おそらく '(None、None) ' – Elazar

+0

関数が' None'を返す場合はどうしますか?その場合、「x」は何をすべきですか?その場合、「y」はどうすべきですか?あなたは本当に 'x'と' y'を使う現在の計算を続けたいと思いますか? –

答えて

10

EAFP

try: 
    x,y = nontest() 
except TypeError: 
    # do the None-thing here or pass 

またはなしで試してください-除い:

res = nontest() 

if res is None: 
    .... 
else: 
    x, y = res 
+0

[PEP 3132](http://www.python.org/dev/peps/pep-3132/)はどうですか?それは何とか関係がありますか? – Elazar

+0

タグ付けされたPythonの場合、OPはPython3.xを意味する(まだ)と思いますか分かりません。 – Anthon

+0

3.xの場合でも、私はそれがここでは関係ないと思います。まず、 'x、* y = nontest()'と書かなければなりません。 'y'が空の場合は' None'を行い、そうでなければ 'y = y [0]'を実行します。 2つのオプションのいずれかと同じくらいきれいです。しかし、もっと重要なことに、 'x、* y = nontest()'は 'None'でも失敗します。代わりに 'nontest'を' return 'None、')に変更しなければなりません。どの時点でも、 'None None、None'を返すだけで、拡張アンパックをする必要はありません。 – abarnert

5

あなたは関数自体を変更することができれば、それは代わりに、関連する例外を発生させるために、おそらくより良いアイデアですNoneを返してエラー状態を通知してください。呼び出し元は、try/exceptとなります。

Noneがエラー条件を示すでない場合は、セマンティクスを再考する必要があります。約

+2

また、何も返すのがまったく適切でない場合は、 '(None、None)'や 'None'ではなく2-tupleである他の値を返しているはずです。 – abarnert

+0

また、 'try' /' catch'ではなく 'try' /' except'です。 – abarnert

+0

@abarnert:もちろんそうです。私は半年でJavaに触れたことはありませんが、それでもまだ私を悩ましています。 – Cairnarvon

6

方法:

x,y = nontest() or (None,None) 

それは、その後、XおよびYは、タプル内のアイテムに割り当てられなければならないような2項目タプルを返すnontest場合。それ以外の場合は、xとyはそれぞれnoneに割り当てられます。欠点は、非テストが空に戻った場合に特別なコードを実行できないことです(上記の答えがあなたの目標であればそれを助けることができます)。それは清潔で読みやすい/維持しやすいことです。

関連する問題