python 变量解包失败

python variable unpacking fails

7.10 并且出于某种原因,以下代码片段产生错误...

device_info = {'username': 'test', 'password': 'test', 'appliance': 'name', 'hostname': 'hostname', 'prodcut': 'juice'}
print "{} {} {} {} {}".format(**device_info)

这引发了一个异常:

Traceback (most recent call last):
  File "python", line 4, in <module>
    print "{} {} {} {} {}".format(**device_info)
IndexError: tuple index out of range

我相信这段代码在语法上应该是合理的,但是,我似乎无法解压我的字典以传递给任何函数,不知道为什么这不起作用。

您将字段作为关键字参数传递,因为您使用的是 ** 语法:

"....".format(**device_info)
#             ^^

然而,您的占位符仅适用于 positional 参数;没有任何名称或索引的占位符将自动编号:

"{} {} {} {} {}".format(...)
# ^0 ^1 ^2 ^3 ^4

这就是你得到索引错误的原因,没有索引为0的位置参数。关键字参数没有索引,因为它们本质上是字典中的键值对,是无序结构。

如果您想将字典中的值包含到一个字符串中,那么您需要明确命名您的占位符:

"{username} {password} {appliance} {hostname} {prodcut}".format(**device_info)

(但请注意 product 的拼写错误 prodcut,您可能需要检查字典键是否拼写正确)。

您将获得所有插入命名槽的值:

>>> print "{username} {password} {appliance} {hostname} {prodcut}".format(**device_info)
test test name hostname juice

如果您希望打印 keys,那么您必须将 device_info 键作为单独的位置参数传递; "...".format(*device_info)(单个 *)就可以做到这一点,但是您还必须满足于列出密钥的 'arbitrary' dictionary order

device_info = {'username': 'test', 'password': 'test', 'appliance': 'name', 'hostname': 'hostname', 'prodcut': 'juice'}

print ("{username} {password} {appliance} {hostname} {prodcut}".format(**device_info))