我想做这样的事情
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()
两次。
你可以写一个函数:
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() 后才具有值。
我(很少)使用函数属性作为 Cstatic
类变量的填充,如下所示:
>>> def f(i):
... f.static+=i
... return f.static
>>> f.static=0
>>> f(1)
1
>>> f(3)
4
有更好的方法可以做到这一点,但只是为了完整......
mydict = {'aa':2, 'bb':'john', 'cc':34, 'dd':'bye'}
a, b, c, d = [mydict[k] for k in ['aa', 'bb', 'cc', 'dd']]