Gah! Failed to reply to all again!

On Sat, Nov 14, 2009 at 1:43 PM, Stephen Nelson-Smith
<sanel...@gmail.com> wrote:
> Hi,
>> I'm not 100% sure to understand your needs and intention; just have a try. 
>> Maybe what you want actually is rather:
>>
>> for log in logs:
>>  for line in log:
>>    print l
>
> Assuming you meant print line.  This also gives me just three lines.
>
>> Meaning your log objects need be iterable. To do this, you must have an 
>> __iter__ method that would surely simply return the object's getline (or 
>> maybe replace it alltogether).
>
> I'm not sure I fully understand how that works, but yes, I created an
> __iter__ method:
>
>   def __iter__(self):
>      self.line=self.logfile.readline()
>      stamp=self.timestamp(self.line)
>      heapq.heappush(self.heap, (stamp, self.line))
>      pop = heapq.heappop(self.heap)
>      yield pop
>
> But I still don't see how I can iterate over it... I must be missing 
> something.
>
> I thought that perhaps I could make a generator function:
>
> singly = ((x.stamp, x.line) for x in logs)
> for l in singly:
>  print
>
> But this doesn't seem to help either.
>
>
>> Then when walking the log with for...in, python will silently call getline 
>> until error. This means getline must raise StopIteration when the log is 
>> "empty" and __iter__ must "reset" it.
>
> Yes, but for how long?  Having added the __iter__ method, if I now do:
>
> for log in logs:
>   for line in log:
>      print line
>
> I still get only three results.
>
>> Another solution may be to subtype "file", for a file is precisely an 
>> iterator over lines; and you really get your data from a file.
>
> I'm very sorry - I'm not sure I understand.  I get that a file is
> iterable by definition, but I'm not sure how subtyping it helps.
>
>> Simply (sic), there must some job done about this issue of time stamps 
>> (haven't studied in details). Still, i guess this track may be worth an 
>> little study.
>
> Sorry for not understanding :(
>
>> Once you get logs iterable, you may subtype list for your overall log 
>> collection and set it an __iter__ method like:
>>
>>    for log in self:
>>        for line in log:
>>            yield line
>>
>> (The trick is not from me.)
>
> OK - I make the logs iterable by giving them an __iter__ method - I
> get that.  I just don't know what you mean by 'subtype list'.
>
>> Then you can write:
>>    for line in my_log_collection
>
> That sounds useful....
>
> S.
>



-- 
Stephen Nelson-Smith
Technical Director
Atalanta Systems Ltd
www.atalanta-systems.com
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to