Equivalent to C bitmasks and enumerations

U

Ulrich Eckhardt

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
 
D

Dave Angel

Ulrich said:
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
 
U

Ulrich Eckhardt

Ulrich Eckhardt wrote:
[how to handle bitfields and enumerations in Python]

Thanks to all that answered. The important lessons I learned:
* You can modify classes, other than in C++ where they are statically
defined. This allows e.g. adding constants.
* __repr__ should provide output suitable as input to the Python
interpreter if possible.

Very interesting!

Uli
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,770
Messages
2,569,584
Members
45,075
Latest member
MakersCBDBloodSupport

Latest Threads

Top