Equivalent to C bitmasks and enumerations

Discussion in 'Python' started by Ulrich Eckhardt, Apr 15, 2009.

  1. 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
    Ulrich Eckhardt, Apr 15, 2009
    #1
    1. Advertising

  2. Ulrich Eckhardt

    Dave Angel Guest

    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



    >
    >
    Dave Angel, Apr 16, 2009
    #2
    1. Advertising

  3. 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

    --
    Sator Laser GmbH
    Geschäftsführer: Thorsten Föcking, Amtsgericht Hamburg HR B62 932
    Ulrich Eckhardt, Apr 20, 2009
    #3
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. exquisitus
    Replies:
    12
    Views:
    22,410
    Tilman Bohn
    Feb 19, 2005
  2. Christopher Benson-Manica

    reinterpret_cast and enumerations

    Christopher Benson-Manica, Nov 2, 2004, in forum: C++
    Replies:
    5
    Views:
    823
    Ron Natalie
    Nov 3, 2004
  3. Aaron Straup Cope

    creating bitmasks (for bloom filters)

    Aaron Straup Cope, Jun 26, 2004, in forum: Python
    Replies:
    0
    Views:
    348
    Aaron Straup Cope
    Jun 26, 2004
  4. Replies:
    1
    Views:
    390
    Ian Collins
    Jun 29, 2006
  5. kasiyil
    Replies:
    3
    Views:
    328
    Jens Theisen
    Aug 21, 2006
Loading...

Share This Page