私はこのようなことをしたいと思います
def f():
return { 'a' : 1, 'b' : 2, 'c' : 3 }
{ a, b } = f() # or { 'a', 'b' } = f() ?
つまり、a には 1 が割り当てられ、b には 2 が割り当てられ、c は未定義になります。
これはこれに似ています
def f()
return( 1,2 )
a,b = f()
私はこのようなことをしたいと思います
def f():
return { 'a' : 1, 'b' : 2, 'c' : 3 }
{ a, b } = f() # or { 'a', 'b' } = f() ?
つまり、a には 1 が割り当てられ、b には 2 が割り当てられ、c は未定義になります。
これはこれに似ています
def f()
return( 1,2 )
a,b = f()
アンパックが変数名に依存するのは意味がありません。あなたが得ることができる最も近いものは次のとおりです。
a, b = [f()[k] for k in ('a', 'b')]
もちろん、これはf()
2 回評価されます。
関数を書くことができます:
def unpack(d, *keys)
return tuple(d[k] for k in keys)
次に、次のようにします。
a, b = unpack(f(), 'a', 'b')
しかし、これは本当にやり過ぎです。シンプルなものが良いでしょう:
result = f()
a, b = result['a'], result['b']
を作成することを検討しf
てください次に、直接namedtuple
使用できますf.a
f.b
うーん。辞書は順序付けられていないため、奇妙なことに、値のアンパックは変数名に依存します。しかし、醜い場合は可能です:
>>> locals().update(f())
>>> a
1
家でこれを試さないでください!保守性の悪夢です。でもちょっとクールすぎる:-)
これを行うには、関数属性を使用 (または悪用) できます。
>>> def f():
... f.a=1
... f.b=2
... return { 'a' : f.a, 'b' : f.b, 'c' : 3 }
...
>>> f()
{'a': 1, 'c': 3, 'b': 2}
>>> a,b=f.a,f.b
>>> a,b
(1, 2)
属性は、 f() が呼び出されるか、手動で割り当てられた後にのみ値を持つことに注意してください。
static
私は (めったに) 関数属性を C のクラス変数の埋め込みとして次のように使用します。
>>> def f(i):
... f.static+=i
... return f.static
>>> f.static=0
>>> f(1)
1
>>> f(3)
4
これを行うためのより良い方法がありますが、完全にするために...