Re-evaluating a string?

Tim Chase python.list at tim.thechases.com
Sun Jul 23 19:22:59 EDT 2006


> serialport.write('!SC'+'\x01'+'\x05'+'\xFA'+'\x00'+'\r')
[cut]
> My problem is that the "write()" function only takes a string, and I
> want to substitute variables for the hex literals.

Well, you can try something like

 >>> import types
 >>> def makeString(a):
...     return ''.join([type(x) != types.IntType and
...		str(x) or chr(x) for x in a])
...
 >>> data = ['!SC', 1, 5, 0xFA, 0, '\r']
 >>> makeString(data)
'!SC\x01\x05\xfa\x00\r'


Thus, you can mix and match your desired data in a list, and then 
let Python intelligently smash together the string you want, so 
you can later pass that to your write() call.

It does hiccup (read "throw an exception") if you have an empty 
string in your list.  It also falls down if you try and put in an 
integer constant that isn't in range(256).  My advice regarding 
these would be "don't do that". :)  Alternatively, you can 
concoct some cousin-function to chr() that takes any old garbage 
along with a default, and returns either the chr() of it, unless 
that throws an expception, in which case you just return 
something like '\x00' (whatever you specified as the default).

This allows you to use your favorite notation.  If you like hex 
notation, you can use it (as in the "0xFA" in the above data). 
If you prefer integers, you can toss them in the mix.

Alternatively, you can create a suite of API wrapper functions, 
such as


def move(rate, low, high, channel=1):
	serialport.write(''.join([type(x) != types.IntType and
...		str(x) or chr(x) for x in
...		['!SC', channel, rate, low, high, '\r']
...		]))

(that could be uncompacted a bit for readibility's sake...)

You could then just call move(5, 0xFA, 0) and the function does 
the heavy work for you.  Might also be more readable later for 
other folks coming to the project (if there are others).

Just a couple ideas you might want to try.

-tkc




	




More information about the Python-list mailing list