8

関数があり、それが呼び出されたときに、戻り値が何に割り当てられるのか、特にタプルとしてアンパックされたときを知りたいです。そう:

a = func()         # n = 1

対。

a, b, c = func()   # n = 3

ninの値を使用したいfuncinspectorには、これを可能にする魔法が必要_getframeです。何か案は?


免責事項 (これは最近必要になっているように思われるため): これはファンキーで悪い習慣であり、製品コードでは使用しないでください。それは実際、私が Perl に期待するもののように見えます。想定される「実際の」問題を解決する別の方法を探しているわけではありませんが、上記で求めたことを達成する方法に興味があります。このトリックのクールな使用法は次のとおりです。

ONE, TWO, THREE = count()
ONE, TWO, THREE, FOUR = count()

def count():
    n = get_return_count()
    if not n:
        return
    return range(n)
4

2 に答える 2

7

Python がこれを行う方法については、魔法のようなものはほとんどありません。

簡単に言えば、左側で複数のターゲット名を使用する場合、右側の式は一致する長さのシーケンスを返す必要があります。

複数の値を返す関数は、実際には1 つのタプルを返すだけです。これは標準的な Python 構造であり、一定の長さのシーケンスです。その長さを測定できます:

retval = func()

print len(retval)

割り当てのアンパックはコンパイル時に決定されます。呼び出している関数に合わせて左側に引数を動的に追加することはできません。

Python 3 では、展開された割り当ての残りを取得するために、splat 構文 (ワイルドカード) を使用できます。

a, b, *c = func()

c最初の 2 を超える残りの値を含むリストになります。

>>> def func(*a): return a
... 
>>> a, b, *c = func(1, 2)
>>> a, b, c
(1, 2, [])
>>> a, b, *c = func(1, 2, 3)
>>> a, b, c
(1, 2, [3])
>>> a, b, *c = func(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack
于 2013-05-10T11:31:38.453 に答える