【问题标题】:python compatibility friendly dictionary methods?python兼容性友好的字典方法?
【发布时间】:2014-03-03 23:52:38
【问题描述】:

在哪里可以找到有关最向前/向后兼容的字典方法的信息?例如,在 python 2.5 之后没有变化并且在 python3 中也将被支持的东西?

例如:我不确定d.itervalues() 是否是一种向后/向前兼容的方法?我用它从字典中获取单个元素:

# is this good form for those who care about compatibility?
d = {"foo": {"bar": []}}
elt = next(d.itervalues())

【问题讨论】:

  • 字典在 Python 中没有顺序。 elt 可能会因相同的dict 而不同运行。要以向后/向前兼容的方式从没有 six.itervalues() 的字典中获取 some 值:d[next(iter(d))]。顺便说一句,next() builtin 仅在 Python 2.6+ 中可用
  • @JFSebastian:我可以满足于 2.6+ 的支持,所以如果next(iter(d)) 在 Python 3 中工作并且不需要将整个列表加载到内存中看起来不像,那么这就是答案

标签: python python-3.x dictionary compatibility backwards-compatibility


【解决方案1】:

对于这个特定的方法字典。itervalues(),在 Python 3 中改为字典。values()

查看这个解决 Python 2 &3 之间兼容性问题的库

https://pythonhosted.org/six/

【讨论】:

  • 令人沮丧的是,这样一个基本的核心功能会在不同版本之间更改名称和推荐的成语。基本上没有适用于这个版本的好方法吗?我不会使用values(),因为那会破坏旧的蟒蛇
  • 同意 :) 在这种情况下,六库可能会很方便。
【解决方案2】:

如果.values() 在内存中实现时不太可能是一个非常大的列表,则它会向前兼容。

可以肯定的是,您可以这样做:

d = {"foo": {"bar": []}}
elt = next(iter(d.values()))

elt 返回

{'bar': []}

我亲自测试过,这适用于 Python 2.6 和 3.3,但 iter was first available in 2.2.

代码将向前兼容,然后当您不再希望在 2 中获得支持时,您可以清理 iter 部分。

【讨论】:

  • values() 不是要把它全部加载到内存中吗?目标不是
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 2010-11-04
  • 2017-07-25
  • 1970-01-01
相关资源
最近更新 更多