Skip to content Skip to sidebar Skip to footer

Subclassing Ctypes - Python

This is some code I found on the internet. I'm not sure how it is meant to be used. I simply filled members with the enum keys/values and it works, but I'm curious what this metacl

Solution 1:

A metaclass is a class used to create classes. Think of it this way: all objects have a class, a class is also an object, therefore, it makes sense that a class can have a class.

http://www.ibm.com/developerworks/linux/library/l-pymeta.html

To understand what this is doing, you can look at a few points in the code.

 _members_ = {'T_UNDEF':0, 'T_NAME':1, 'T_NUMBER':2, 'T_STRING':3, 'T_OPERATOR':4, 'T_VARIABLE':5, 'T_FUNCTION':6}

globals()[key] = value

Here it takes every defined key in your dictionary: "T_UNDEF" "T_NUMBER" and makes them available in your globals dictionary.

def__init__(self, value):
    for k,v inself._members_.items():
        if v == value:self.name = k
            break

Whenever you make an instance of your enum, it will check to see if the "value" is in your list of allowable enum names when you initialized the class. When the value is found, it sets the string name to self.name.

c_uint.__init__(self, value)

This is the actual line which sets the "ctypes value" to an actual c unsigned integer.

Solution 2:

That is indeed a weird class.

The way you are using it is correct, although another way would be:

classTOKEN(Enumeration):
    T_UNDEF    =0
    T_NAME     = 1
    T_NUMBER   = 2
    T_STRING   = 3
    T_OPERATOR = 4
    T_VARIABLE = 5
    T_FUNCTION = 6

(That's what the first 6 lines in __new__ are for)

Then you can use it like so:

>>>TOKEN
<Enumeration TOKEN>
>>>TOKEN(T_NAME)
<member T_NAME=1 of <Enumeration TOKEN>>
>>>T_NAME in TOKEN
True
>>>TOKEN(1).name
'T_NAME'

The from_param method seems to be for convenience, for writing methods that accept either an int or an Enumeration object. Not really sure if that's really its purpose.

I think this class is meant to be used when working with external APIs the use c-style enums, but it looks like a whole lot of work for very little gain.

Post a Comment for "Subclassing Ctypes - Python"