Equivalent to C bitmasks and enumerations

Ulrich Eckhardt eckhardt at satorlaser.com
Wed Apr 15 12:51:31 CEST 2009


Greetings!

I'm currently using Python to implement a set of tests for code that is
otherwise written in C. This code was wrapped using Boost.Python and is
then loaded into Python as module.

What I often have in C is this:

  // bitfield (several flags combined)
  #define STATUS_OVERTEMP 1u
  #define STATUS_ON_FIRE 2u
  #define STATUS_BORED 4u
  unsigned get_status(void);

  // enumeration (distinct values from a set)
  enum color { color_red=1, color_green=13, color_mauve=42 };
  enum color get_color(void);

What I'm looking for is a suggestion how to handle this in Python. Note that
technically, this works without problem, I'm rather looking for stylistic
advise. What I currently have is these (note: I'm retyping this, so ignore
any syntax errors, please):

 STATUS_OVERTEMP = 1
 STATUS_ON_FIRE = 2
 STATUS_BORED = 4
 def status_as_string(st):
     tmp = []
     if st&STATUS_OVERTEMP:
         tmp.append("OVERTEMP")
     if st&STATUS_ON_FIRE:
         tmp.append("ON_FIRE")
     if st&STATUS_BORED:
         tmp.append("BORED")
     return "|".join(tmp)

 COLOR_RED = 1
 COLOR_GREEN = 13
 COLOR_MAUVE = 42
 def color_as_string(c):
     names = {
         COLOR_RED:"RED",
         COLOR_GREEN:"GREEN",
         COLOR_MAUVE:"MAUVE"}
     return names[c];

Further, I also tried defining a separate class:

 class Color(int):
     RED = 1
     GREEN = 13
     MAUVE = 42
     names = { RED:"RED", GREEN:"GREEN", MAUVE:"MAUVE"}

     def __str__(self):
         return names[c];
     ...
  

To be a bit more explicit about what I would like, here is an example how I
would like to use it:

  c = Color.RED
  type(c) # should yield class Color
  str(c) # should yield "RED"
  Color(999) # should signal the invalid color value


Any other suggestions how to structure this or rewrite this?

thanks!

Uli

  
-- 
Sator Laser GmbH
Geschäftsführer: Thorsten Föcking, Amtsgericht Hamburg HR B62 932




More information about the Python-list mailing list