2012-02-09 214 views
2

Python是否有用于字符串FIFO缓冲的数据类型?我创造了一些东西(下面),但怀疑我正在重新发明轮子。Python字符串FIFO

class Buffer(list): 
    def __init__(self): 
     super(Buffer, self).__init__() 

    def put(self, nlmsg): 
     for c in nlmsg: self.append(c) 

    def peek(self, number): 
     return "".join([self[i] for i in range(number)]) 

    def get(self, number): 
     return "".join([self.pop(0) for i in range(number)]) 

用例:

>>> buf = Buffer() 
>>> buf.put('abcdefg') 
>>> buf 
['a', 'b', 'c', 'd', 'e', 'f', 'g'] 
>>> buf.peek(4) 
'abcd' 
>>> buf 
['a', 'b', 'c', 'd', 'e', 'f', 'g'] 
>>> buf.get(5) 
'abcde' 
>>> buf 
['f', 'g'] 

我看着Queue但添加STR当我不得不每个字节手动分割,否则整个STR将成为在队列中的项目。有没有这样的东西?

+1

不StringIO的你需要什么? http://docs.python.org/library/io.html#io.StringIO – 2012-02-09 21:35:57

+0

@ThomasK我没有看过。但一看起来,它看起来可能不起作用,因为当读取正面时,它看起来像我将不得不移动剩余的数据,或者保留一个指向我在字符串中读取的位置的指针。 (即时通讯的一种newb,所以我可能会失去一些东西) – tMC 2012-02-09 21:43:37

+0

类包装是我的好主意。然而,我会从'str'而不是列表继承。字符串已经具有切片功能,并且可以节省使用'join'的成本。 'timeit',看看什么效果更好:) – 2012-02-09 22:11:42

回答

3

使用collections.deque这将实现如下:

from collections import deque 

class Buffer(deque): 
    def put(self, iterable): 
     for i in iterable: 
      self.append(i) 

    def peek(self, how_many): 
     return ''.join([self[i] for i in xrange(how_many)]) 

    def get(self, how_many): 
     return ''.join([self.popleft() for _ in xrange(how_many)]) 



buf = Buffer() 
buf.put('abcdefg') 
print buf 
print buf.peek(4) 
print buf 
print buf.get(5) 
print buf 

输出示例:

deque(['a', 'b', 'c', 'd', 'e', 'f', 'g']) 
abcd 
deque(['a', 'b', 'c', 'd', 'e', 'f', 'g']) 
abcde 
deque(['f', 'g']) 
0

字符串类型本身如何?

>>> buf = "" 
>>> buf += "abcdefg" 
>>> buf 
'abcdefg' 
>>> list(buf) 
['a', 'b', 'c', 'd', 'e', 'f', 'g'] 
>>> buf[:4] # instead of peek 
'abcd' 
>>> got,buf = buf[:5],buf[5:] # instead of get 
>>> got 
'abcde' 
>>> buf 
'fg' 

get()的成语是唯一明显难看的东西。

+0

这是我的第一个想法,但我想我宁愿使用'list',因为字符串不可变。 – tMC 2012-02-09 21:46:01

+1

如果您打算使用列表,请改为使用'collecitons.deque'。 – kindall 2012-02-09 22:41:18