Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Re: Style help for a Smalltalk-hack

Reply
Thread Tools

Re: Style help for a Smalltalk-hack

 
 
Ethan Furman
Guest
Posts: n/a
 
      10-28-2012
Travis Griggs wrote:
> I'm writing some code that does a structured read from formatted binary file. The code I came up with looks like:
>
> # get the first four bytes, the first gap field
> chunk = byteStream.read(4)
> while chunk:
> # interpret the gap bytes
> gap, = struct.unpack('>I', chunk)
> # suck off the valveCount
> valveCount, = struct.unpack('>I', byteStream.read(4))
> # collect the next valveCount signatures
> signatures = [struct.unpack('>I', byteStream.read(4))[0] for _ in range(valveCount)]
> self.script.append(ScriptSpan(gap=gap, valveSet=signatures))
> # now get the next 4 bytes for the gap of the next iteration, it'll be empty if we're at end
> chunk = byteStream.read(4)
>
> I can't help but thinking that there's some better way (i.e. more pythonic) to do this that doesn't involve having to use another module (Construct) or exploring generators or something like that. What bugs me about it is that there is two different styles for reading/decoding values from the byte stream. valveCount and signatures are both paired invocations of unpack() and read(). But to detect the end of the stream (file), I have to split the read() and unpack() of the gap value across 3 different lines of the code, and they don't even sit adjacent to each other.


What do you have against generators?

How about an iterator approach:

8<-------------------------------------------------------
class Gap_Valve_Reader(object): # untested
def __init__(self, filename):
self.byteStream = open(filename)
def __iter__(self):
return self
def __next__(self): # python 3 name
chunk = self.byteStream.read(
if not chunk:
self.byteStream.close()
raise StopIteration
gap, valveCount = struct.unpack('>II', chunk)
signatures = struct.unpack('>%sI' % valveCount,
self.byteStream.read(4 * valueCount))
return gap, signatures
next = __next__ # python 2 name
8<-------------------------------------------------------

then your main code can look like:

8<-------------------------------------------------------
gvr = Gap_Valve_Reader('binary_file.bin')
for gap, signatures in gvr:
self.script.append(ScriptSpan(gap=gap, valveSet=signatures))
8<-------------------------------------------------------

Don't forget to add error checking where appropriate.

~Ethan~
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
DataGrid header style inconsistent with sortable column style cedoucette@alum.rpi.edu ASP .Net 0 10-14-2005 12:13 AM
All style tags after the first 30 style tags on an HTML page are not applied in Internet Explorer Rob Nicholson ASP .Net 3 05-28-2005 03:11 PM
Need help with Style conversion from Style object to Style key/value collection. Ken Varn ASP .Net Building Controls 0 04-26-2004 07:06 PM
Javascript Style Switcher that remebers current site style in use Hardeep Rakhra HTML 8 01-15-2004 08:00 PM
Style sheets, include one style within another (not inheritance) foldface@yahoo.co.uk HTML 1 11-24-2003 01:37 PM



Advertisments