2012-02-09 216 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