Equivalent to C bitmasks and enumerations

Dave Angel davea at ieee.org
Wed Apr 15 20:13:28 EDT 2009


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



>   
>   



More information about the Python-list mailing list