2016-11-02 4 views
1

に最初のAssingingすることは、我々が関数の戻り値は、intまたはintのリストのいずれかを返します。変数

def f_1(): 
    return (3, 4) 

def f_2(): 
    return 2 

機能が与えられていると仮定します。私が変更できるコードではありません。 整数またはそのシーケンスを返します。

私は変数に戻り値を代入したいと考えています。返り値がシーケンスの場合は、最初の整数だけを取る必要があります。

Pythonでビルドイン構文デバイスがありますか?

for function in [f_1, f_2]: 
    ... 
    x = function()[0] # Works for f_1, breaks for f_2 
    y = function() # Works for f_2, assigns (3, 4) for f_1 while 
         # we really would like only the 3 to be the 
         # assigned value 

注:私たちが列を返すだけの数を返す機能するのかわからないことを仮定します。

x = function() 
try: 
    x = x[0] 
except TypeError: 
    pass 

答えて

2

forgivnessための通常の練習はaskにあるビルドで構文デバイス

号です。私にはそれは過度のことです。ループ常にのボディに呼び出される関数は、シーケンスを返すことを保証するために、他の方向に行く

result = function() 
# this can be changed to abc.Sequence for more general approach 
if isinstance(result, (list, tuple)): 
    result = result[0] 
+5

A * catch-all * exceptはおそらく許されません –

+0

True。それを修正しました。 –

1

私はのために行くwouldntの声明のtry-除い:

+1

これはPythonの "許可よりも許してもらう方が良い"と反対します。私はあなたの答えに同意しないと言っているわけではありませんが、おそらくユニダイマムと考えられています。 – Carcigenicate

+0

それはpythonicではありません。 https://docs.python.org/3/glossary.html#term-eafp –

+1

はい、私はそれについて読んでいました。そのポイントは、エラータイプをTypeErrorから他のタイプに変更するとどうなるでしょうか?それを修正するにはソースコードを変更する必要があります。私はまだ私の答えに固執しますが、それはpythonicではないことを覚えています。先端に感謝します。 – Nf4r

1

別の関数でf_2をラップ:

もっとありそうな私のような何かをしようとします。

for function in [f_1, lambda : (f_2(),)]: 
    x = function()[0] 

別の関数呼び出しのオーバーヘッドがあると、このアプローチが望ましくないことがあります。

+0

申し訳ありませんが、どの関数がリストを返しているのか分かりません。 – myfirsttime1

+0

@ myfirsttime1好奇心の外に、どのように各機能の復帰を知らないのですか?彼らはどちらもどちらかに戻りますか? 1つはリストを返し、もう1つは数字を返しますか? – Carcigenicate

+0

機能が入力されます。私は彼らがその2つのケースのうちの1つを返すことができることを知っているだけですが、どちらがどちらかを知らない。 – myfirsttime1

関連する問題