Python 将字典传递给具有**

Python 将字典传递给具有**,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我正在努力理解以下内容 def exp(**argd): print(argd) a={1:'a',2:'b'} exp(**a) This will give TypeError: exp() keywords must be strings. 如果我使用a={'1':'a','2':'b',这工作正常。为什么我不能将字典键作为数字传递给exp函数?因为您不能(Guido可能是唯一一个可以告诉您原因的人)。。。它使它们部分遵守变量命名规则。。。**a_dict解压d

我正在努力理解以下内容

 def exp(**argd):
     print(argd)

  a={1:'a',2:'b'}
  exp(**a)

This will give TypeError: exp() keywords must be strings. 
如果我使用a={'1':'a','2':'b',这工作正常。为什么我不能将字典键作为数字传递给exp函数?

因为您不能(Guido可能是唯一一个可以告诉您原因的人)。。。它使它们部分遵守变量命名规则。。。
**a_dict
解压dict

a={1:'a',2:'b'}
exp(**a)  #is basically exp(1='a',2='b') 
这显然是一个语法错误

虽然它允许像这样有趣的事情

a = {'a variable':7,'some$thing':88}
exp(**a)
只要它们是字符串。。。看起来他们执行的唯一规则是他们是字符串。。。这可能会保证它们是可散列的(一个巨大的猜测…)

免责声明:这可能是一种严重的过度简化

,因为您不能(Guido可能是唯一一个可以告诉您原因的人)。。。它使它们部分遵守变量命名规则。。。
**a_dict
解压dict

a={1:'a',2:'b'}
exp(**a)  #is basically exp(1='a',2='b') 
这显然是一个语法错误

虽然它允许像这样有趣的事情

a = {'a variable':7,'some$thing':88}
exp(**a)
只要它们是字符串。。。看起来他们执行的唯一规则是他们是字符串。。。这可能会保证它们是可散列的(一个巨大的猜测…)

免责声明:这可能是一种严重的过度简化

exp(**a)
在您的示例中,按字面意思扩展为
exp(1='a',2='b')
,这是一个错误,因为整数文字不能是变量名

您可能会想,为什么**进程不将键强制转换为字符串作为扩展的一部分?没有一个单一的原因,但一般来说Python的哲学是“显式优于隐式”,隐式强制转换可能有一些缺陷——例如,许多彼此不同的对象类型将强制转换为同一个字符串,如果在扩展过程中依赖隐式字符串转换,则可能会导致意外后果。

exp(**a)
在您的示例中,从字面上扩展为
exp(1='a',2='b')
,这是一个错误,因为整数文本不能是变量名


您可能会想,为什么**进程不将键强制转换为字符串作为扩展的一部分?没有一个单一的原因,但一般来说Python的哲学是“显式优于隐式”,隐式强制转换可能有一些缺陷——例如,许多彼此不同的对象类型将强制转换为同一个字符串,如果在扩展过程中依赖隐式字符串转换,可能会导致意外后果。

检查**kwargs在python中检查**kwargs在python中也不能
“变量名”
。。。但它会接受这是一个很好的观点,事实上,在我读到你的答案之前我并不知道。我只能假设这是一个漏洞或未指定的行为,而不是创建通常无效的变量名的可接受的方法!我不反对。。。但这一事实基本上使这个答案中的很多无效imho(也就是说它仍然是一个可靠的答案)您声明它是因为使用未打包的变量名是一个语法错误。。。但它允许无限多个不可能的变量名。。。这只是因为python解释器要求函数关键字是字符串。。。它与语法正确的参数名称无关(或者至少关系不大)(如果解释器有意的话,那么强制变量命名约定对解释器来说是微不足道的)。是的,我编辑了答案以删除对语法错误的引用,因为实际抛出的错误是类型错误。尽管如此,我认为整数文本和其他非字符串导致异常的答案是正确的,因为它们不适合作为变量名。在本例中,解释器没有对变量名强制执行其他与类型无关的约束这一事实是一个奇怪的细节,但我不认为它会使上述内容无效。。。但它会接受这是一个很好的观点,事实上,在我读到你的答案之前我并不知道。我只能假设这是一个漏洞或未指定的行为,而不是创建通常无效的变量名的可接受的方法!我不反对。。。但这一事实基本上使这个答案中的很多无效imho(也就是说它仍然是一个可靠的答案)您声明它是因为使用未打包的变量名是一个语法错误。。。但它允许无限多个不可能的变量名。。。这只是因为python解释器要求函数关键字是字符串。。。它与语法正确的参数名称无关(或者至少关系不大)(如果解释器有意的话,那么强制变量命名约定对解释器来说是微不足道的)。是的,我编辑了答案以删除对语法错误的引用,因为实际抛出的错误是类型错误。尽管如此,我认为整数文本和其他非字符串导致异常的答案是正确的,因为它们不适合作为变量名。在本例中,解释器没有对变量名强制其他与类型无关的约束这一事实是一个奇怪的细节,但我不认为它会使上述内容无效。