Ulrich Eckhardt wrote:
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

For the Color example, how's this for a starting place:


class Color(object):
   def __init__(self, name, enum):
       self.enum = enum
       self.name = name
       setattr(Color, name, self)

   @staticmethod
   def seal():
       del Color.__init__
       del Color.seal

   def __str__(self):
       return self.name



Color("RED", 4)
Color("GREEN", 11)
Color.seal()        #prevent any new instances from being created


b = Color.RED
print type(b)
print str(b)

a = Color.GREEN
print a
print a.enum

k = Color
xx = Color("aaa", 42)  #error



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

Reply via email to