2014-01-09 7 views
1

목록이있는 회원이 csv.reader 개체가 아닌지 확인하면 결과가 달라집니다. 아래는 unittest 모듈을 사용합니다. 회원목록 및 csv.reader와 회원 테스트 결과가 다릅니다

with open("file.tab", 'rb') as f: 
    reader = csv.reader(f, delimiter='\t') 
    reader = [record for record in reader] 
    self.assertTrue(['1', '2', '3', '4'] in reader) 
    self.assertTrue(['2', '3', '4', '5'] in reader) 
    self.assertTrue(['3', '4', '5', '6'] in reader) 

에 대한 회원에 대한

csv.reader 테스트

with open("file.tab", 'rb') as f: 
    reader = csv.reader(f, delimiter='\t') 
    self.assertTrue(['1', '2', '3', '4'] in reader) 
    self.assertTrue(['2', '3', '4', '5'] in reader) 
    self.assertTrue(['3', '4', '5', '6'] in reader) 

목록 테스트 나는 file.tab 난을 테스트하고있어 세 가지 기록에 대한 항목이 포함되어 알고 있지만, 세 번째 어설 csv.reader를 사용할 때 "거짓은 사실이 아닙니다"라는 메시지가 나오고 목록을 사용할 때 전달됩니다.

csv.reader는 생성자입니다. docs은 명시 적으로 말하지 않지만, 소모 할 수 있기 때문에 그것이 생성기라는 것을 의미한다고 생각합니다. 내 생각이 이유가 될 수도 있습니다,하지만 다음과 같은 시험 인쇄 아무것도하지만 사실 : 나를 발전기와 회원에 대한 문제 테스트가 없다는 것을 생각하게

x = xrange(5) 
for m in range(5): 
    for n in range(5): 
     print m in x 
     print n in x 

.

목록을 사용할 때보 다 csv.reader를 사용할 때 세 번째 어설트 문이 다르게 평가되는 이유는 무엇입니까?

+2

'독자 = [기록은 독자의 레코드]'독자'로 쓸 수있다 = 목록 (csv.reader (f, delimiter = '\ t'))'와 마찬가지로 그냥 –

+3

'xrange' 실제로 [불변의 순서] (http://docs.python.org/2/library/stdtypes.html)를 반환합니다. # typesseq-xrange), 발전기가 아닙니다. – poke

답변

5

당신은 거기에 불운이 있습니다. xrange은 실제로 발전기가 아니며, 느리게 행동하는 자체의 특수한 유형이기 때문에, 당신을 속일 수 있다고 생각하게 만듭니다. 회원 테스트 내용에 따라 다른 대답을 반환 할 수 있습니다 이유입니다, 목록이 없습니다 reader 인스턴스가 소진 될 수 있지만 :

>>> it = iter(range(10)) 
>>> 5 in it 
True 
>>> 5 in it 
False 

>>> x = xrange(10) 
>>> 5 in x 
True 
>>> 5 in x 
True 

하지만

그래서 당신의 논리는 옳았다. 그 회원 테스트는 단락 회로, 그래서 그들은 긍정적 인 결과의 경우 배출 할 필요가 없습니다 수 있지만 참고 :이 값을 발견하면서

>>> it = iter(range(10)) 
>>> 3 in it 
True 
>>> next(it) 
4 
+0

아하! xrange에 대해 잘 알고 있습니다. – ABM

1

예, csv.reader는 발전기 및 in 반복이다. DSM이 시연 한 것처럼

CSV 파일에서 행의 순서는 테스트와 다릅니다. 당신이 순서를 변경하는 경우 귀하의 테스트를 통과합니다

>>> def fake_reader(): 
...  yield ['1', '2', '3', '4'] 
...  yield ['2', '3', '4', '5'] 
...  yield ['3', '4', '5', '6'] 

>>> reader = fake_reader() 
>>> ['1', '2', '3', '4'] in reader 
True 
>>> ['2', '3', '4', '5'] in reader 
True 
>>> ['3', '4', '5', '6'] in reader 
True 

를 그리고 순서가 다른 경우 실패 :

>>> def fake_reader(): 
...  yield ['1', '2', '3', '4'] 
...  yield ['3', '4', '5', '6'] # changed order 
...  yield ['2', '3', '4', '5'] 

>>> reader = fake_reader() 
>>> ['1', '2', '3', '4'] in reader # reads one row 
True 
>>> ['2', '3', '4', '5'] in reader # reads two rows! 
True 
>>> ['3', '4', '5', '6'] in reader # there are no more rows to read 
False 
관련 문제