On Jun 20, 9:17 am, Bruno Desthuilliers <bruno.
[EMAIL PROTECTED]> wrote:
> eliben a écrit :> Hello,
>
> > In a Python program I'm writing I need to dynamically generate
> > functions[*]
>
> (snip)
>
> > [*] I know that each time a code generation question comes up people
> > suggest that there's a better way to achieve this, without using exec,
> > eval, etc.
>
> Just to make things clear: you do know that you can dynamically build
> functions without exec, do you ?
>

Yes, but the other options for doing so are significantly less
flexible than exec.

> > But in my case, for reasons too long to fully lay out, I
> > really need to generate non-trivial functions with a lot of hard-coded
> > actions for performance.
>
> Just out of curiousity : could you tell a bit more about your use case
> and what makes a simple closure not an option ?

Okay.

I work in the field of embedded programming, and one of the main uses
I have for Python (and previously Perl) is writing GUIs for
controlling embedded systems. The communication protocols are usually
ad-hoc messages (headear, footer, data, crc) built on top of serial
communication (RS232).

The packets that arrive have a known format. For example (YAMLish
syntax):

packet_length: 10
fields:
  - name: header
    offset: 0
    length: 1
  - name: time_tag
    offset: 1
    length: 1
    transform: val * 2048
    units: ms
  - name: counter
    offset: 2
    length: 4
    bytes-msb-first: true
  - name: bitmask
    offset: 6
    length: 1
    bit_from: 0
    bit_to: 5
...

This is a partial capability display. Fields have defined offsets and
lengths, can be only several bits long, can have defined
transformations and units for convenient display.

I have a program that should receive such packets from the serial port
and display their contents in tabular form. I want the user to be able
to specify the format of his packets in a file similar to above.

Now, in previous versions of this code, written in Perl, I found out
that the procedure of extracting field values from packets is very
inefficient. I've rewritten it using a dynamically generated procedure
for each field, that does hard coded access to its data. For example:

def get_counter(packet):
  data = packet[2:6]
  data.reverse()
  return data

This gave me a huge speedup, because each field now had its specific
function sitting in a dict that quickly extracted the field's data
from a given packet.

Now I'm rewriting this program in Python and am wondering about the
idiomatic way to use exec (in Perl, eval() replaces both eval and exec
of Python).

Eli





--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to