我正在使用locals函数来创建一个可迭代对象,该对象填充了我调用此函数时提供的a,b,c的值。当我遍历locals返回的dictionairy时,我遍历变量名称,而不是值。但是l.values不可迭代,我猜它指的是一个函数,而不是像我期望的那样的列表。
cd
有没有更好的方法来列出这些值?我可以用更蛮力的方式做到这一点,但我正在努力学习所有这些内置功能以及它们有什么用处。
或者有没有办法迭代我缺少的dictionairies值?
两种不同的方法来完成同样的事情,是吗?
Traceback (most recent call last):
file.py on line ?, in getUserOutputs
userOutput = _runaedlz(testInputs[i])
file.py on line ?, in _runaedlz
return extraNumber(*_fArgs_dfasruobxant)
file.py on line 5, in extraNumber
for i in l:
TypeError: 'builtin_function_or_method' object is not iterable
答案 0 :(得分:1)
locals()
的一个潜在问题是它返回一个字典,并且字典中的值的顺序没有定义,因此列出值可能会相对于它们传递的顺序进行置换到功能。如果您确实想要执行此类操作,则可以使用函数__code__
对象的__co_varnames
属性来定义订单。类似的东西:
def extraNumber(a, b, c):
loc = locals() #should be the first line, so that only parameters have values
vals = list(loc.values()) #order might have been changed
lvals = extraNumber.__code__.co_varnames
orderedVals = [loc[x] for x in lvals if x in loc]
return vals, orderedVals #both returned for comparison
当我跑步时,我得到了:
>>> extraNumber(1,2,3)
([3, 2, 1], [1, 2, 3])
不同的运行(特别是在新的Python shell中)将在第一个返回的列表中具有不同的顺序,但第二个将始终为[1,2,3]
答案 1 :(得分:0)
>>> def extraNumber(a,b,c):
... for i in locals().values():
... yield i
...
>>>
>>> for n in extraNumber(5,10,7):
... n
...
10
5
7
我使用了 yield 语句,因为 extraNumber 函数会为每个参数值生成一个值。
作为替代方案,如果你想要整个列表,你可以使用这样的东西。
>>> def extraNumber(a,b,c):
... parameterValues=list(locals().values())
... return parameterValues
...
>>> extraNumber(5,10,7)
[10, 5, 7]