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