On 3/10/2012 11:56 AM, Ethan Furman wrote:

I'm writing a metaclass to do some cool stuff, and part of its
processing is to check that certain attributes exist when the class is
created. Some of these are mutable, and would normally be set in
`__init__`, but since `__init__` isn't run until the instance is created
the metaclass won't know that the attribute *will* be created, and
raises an error.

c. Check the code object to see if the attribute will be created.

I have no idea how to do this -- pointers?

Capture output of dis.dis(targetclass.__init__) by temporarily setting sys.stdout to StringIO object. (There is tracker issue to make lines available to a program without doing this.)

>>> from dis import dis
>>> def f(self):
        self.attr = 1
        
>>> dis(f)
  2           0 LOAD_CONST               1 (1)
              3 LOAD_FAST                0 (self)
              6 STORE_ATTR               0 (attr)
              9 LOAD_CONST               0 (None)
             12 RETURN_VALUE

Look for STORE_ATTR line with target attribute name. If you want to check for wacko code that does setattr(self, 'attr', value), try it in 'f' and dis again.

Anything to do with code objects (and dis module) is implementation and version specific

---
Terry Jan Reedy
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to