2013-12-17 2 views
2

내가 파이썬 사전에 cStringIO를 사용하여 매우 큰 문자열 스트림을 읽을려고 스트림하기 먼저 경로에 데이터가 존재 함을 주장, stream_write을 테스트하고 stream_read 전화 : 내 테스트 스위트 그러나사용하여 발전기 cStringIO 문자열

def test_stream(self): 
    filename = self.gen_random_string() 
    # test 7MB 
    content = self.gen_random_string(7 * 1024 * 1024) 
    # test stream write 
    io = StringIO.StringIO(content) 
    self._storage.stream_write(filename, io) 
    io.close() 
    self.assertTrue(self._storage.exists(filename)) 
    # test read/write 
    data = '' 
    for buf in self._storage.stream_read(filename): 
     data += buf 
    self.assertEqual(content, data) 

, 내가 잡고있어 지정해 AssertionError :

====================================================================== 
FAIL: test_stream (test_swift_storage.TestSwiftStorage) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/home/bacongobbler/.../test/test_local_storage.py", line 44, in test_stream 
    self.assertEqual(content, data) 
AssertionError: '[squelched]' != '<cStringIO.StringI object at 0x3148e70>' 
---------------------------------------------------------------------- 
Ran 28 tests in 20.495s 

FAILED (failures=1) 

외모는 an issue I posted last week과 관련되어 보입니다. 그러나이 경우에는 stream이 생성기로 설정된 이유를 잘 모르겠습니다.

def put_content(self, path, content, chunk=None): 
    path = self._init_path(path) 
    try: 
     self._swift_container[path] = content 
    except Exception: 
     raise IOError("Could not put content") 

contentio입니다 : self._storage.stream_write(filename, io)를 호출 할 때 누군가가 소스 코드에 대해 자세히 살펴하고자하는 경우

, 그것은 당신이 단지StringIO 객체를 저장 https://github.com/bacongobbler/docker-registry/blob/106-swift-storage/test/utils/mock_swift_storage.py

답변

2

전혀이야 전달한 객체

나중에 해당 파일 객체를 StringIO에 다시 전달합니다.

stream = StringIO.StringIO(self.get_content(path)) 

이것은 cStringIO.StringI() 인스턴스의 캐릭터 라인 표현, 저장, self.get_content(path)str() 호출

>>> from cStringIO import StringIO 
>>> str(StringIO('test data')) 
'<cStringIO.StringI object at 0x1074ea470>' 

귀하의 코드가 잘 작동 읽기, 실제로 데이터를 취할 필요가 당신의 쓰기 모형이다 StringIO 개체의 개체.

.read() 호출은 여기에 수행합니다

def put_content(self, path, content, chunk=None): 
    path = self._init_path(path) 
    try: 
     self._swift_container[path] = content.read() 
    except Exception: 
     raise IOError("Could not put content") 
+0

HERP의 DERP, 내가 한 것을를 놓쳤다. 잘 잡으세요! – bacongobbler