某些方法的python backports

时间:2010-09-24 08:36:31

标签: python methods backport

以下方法是否有任何反向使用python 2.4:

any, all, collections.defaultdict, collections.deque

2 个答案:

答案 0 :(得分:5)

好吧,至少anyall很容易:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

deque已经在2.4。

至于defaultdict,我猜您可以使用setdefault()轻松模仿。

引自Alex Martelli(以及其他人)的强烈推荐Python Cookbook

  

这就是setdefault方法   词典是为了。说我们是   建立一个单词到页码   index,一个映射每个单词的字典   到它的页码列表   出现。这是一段关键代码   申请可能是:

def addword(theIndex, word, pagenumber):
    theIndex.setdefault(word, [ ]).append(pagenumber)
  

此代码相当于更多   详细的方法如:

def addword(theIndex, word, pagenumber):
    if word in theIndex:
        theIndex[word].append(pagenumber)
    else:
        theIndex[word] = [pagenumber]
  

def addword(theIndex, word, pagenumber):
    try:
        theIndex[word].append(pagenumber)
    except KeyError:
        theIndex[word] = [pagenumber]

答案 1 :(得分:5)

蒂姆指出,allany是微不足道的。 defaultdict并不困难。我相信这是一个可以通过的实现。它本质上是将文档翻译成代码。

更新:删除了三元表达式,因为我记得那不是2.4

class defaultdict(dict):
     def __init__(self, default_factory, *args, **kwargs):
         super(defaultdict, self).__init__(*args, **kwargs)
         self.default_factory = default_factory

     def __missing__(self, key):
         try:
             self[key] = self.default_factory()
         except TypeError:
             raise KeyError("Missing key %s" % (key, ))
         else:
             return self[key]

     def __getitem__(self, key):
         try:
             return super(defaultdict, self).__getitem__(key)
         except KeyError:
             return self.__missing__(key)

如果您只是使用它来构建字典,那么您可能希望将EAFP更改为__getitem__的LBYL。现在它已经过优化,可以构建dict,然后使用它一段时间进行大量的非错失查找。

deque将更加艰难。我希望我有时间这样做只是因为它可能是我最喜欢的收藏品,但它并非无足轻重。没关系。刚刚阅读Tims的帖子。你明白了。