在Python 2.7.3中使用字典作为switch语句

rah*_*hmu 3 python dictionary switch-statement

我喜欢使用词典作为一种形式的switch陈述,通过设置布尔值作为键.例:

>>> def f(a):
...      return {True: -a, a==0: 0, a > 0: a}[True]
... 
>>> f(-3)
3
>>> f(3)
3
>>> f(0)
0
Run Code Online (Sandbox Code Playgroud)

密钥True作为else/ defaultcase使用,仅在未评估其他密钥时返回True.我猜这是假设迭代字典的某种评估顺序.

现在看一下Python团队最新发布的最新版本的分支2.6,2.7,3.1和3.2 的以下摘录:

散列随机化导致dicts和集的迭代顺序不可预测,并且在Python运行中不同.Python从未保证dict或set中键的迭代顺序,建议应用程序永远不要依赖它.从历史上看,dict迭代顺序在各个版本中并没有经常发生变化,并且在Python的连续执行之间始终保持一致.因此,一些现有的应用程序可能依赖于字典或集合排序.

这是否意味着使用dicts作为切换呼叫将不再可能?或者也许我应该使用任何其他类(喜欢OrderedDict或什么)?或者也许我完全不在了,它根本不应该影响到这一点?

Kar*_*ath 6

你误解了这段代码是如何工作的.

你的词典只有两个键:TrueFalse.True密钥可能存在多个冲突值,但在字典初始化时会得到解决.

字典查找没有迭代.


Eli*_*sky 5

散列随机化不会影响您的应用程序.它应该只影响依赖于字典中键的迭代顺序的应​​用程序.

也就是说,我发现你的技术比简单的if..elif链条更加模糊,效率也更低(建立一个新的dict并不便宜).