Introspection and member ordering

R

Rim

Hi,

Is there a way to get any sort of introspection which would return the
content of an instance *in the order they were declared or executed*
as opposed to alphabetical order?

Example:
.... def __init__(self):
.... self.value = 12
.... self.avalue = 78.... def __init__(self):
.... a.__init__(self)
.... self.bvalue = 5
.... def f(self):
.... self.z = 3
.... {'bvalue': 5, 'avalue': 78, 'value': 12}

Wrong answer, I am looking for something that would give me
{'value':12, 'avalue':78, 'bvalue':5'}

I tried the inspect.getmembers(c) without success.

Anyone has some advice how I can get the members listed in declaration
or execution order?

Thanks
-Rim
 
J

Josiah Carlson

Is there a way to get any sort of introspection which would return the
content of an instance *in the order they were declared or executed*
as opposed to alphabetical order?

Example:

... def __init__(self):
... self.value = 12
... self.avalue = 78
... def __init__(self):
... a.__init__(self)
... self.bvalue = 5
... def f(self):
... self.z = 3
...
{'bvalue': 5, 'avalue': 78, 'value': 12}

Wrong answer, I am looking for something that would give me
{'value':12, 'avalue':78, 'bvalue':5'}

I tried the inspect.getmembers(c) without success.

Anyone has some advice how I can get the members listed in declaration
or execution order?

Rim,

You'd have to either overload the class's __getattribute__, __setattr__
and __delattr__ methods, or replace the builtin instance.__dict__
attribute with a new dictionary-like object that will produce the
ordering you want.

As an option, I've written an LRU that does such kinds of updates
quickly, though it also updates on read. Reading the comment at the
bottom will allow you to translate the update on read, to only updating
on write. The recipe is available here:
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/252524

Doing a quick check, it doesn't look like you can say:
self.__dict__ = NON_DICT_OBJECT

Making LRU a subclass of dict seems to work on the surface, but it looks
to break a few things. Perhaps I should rewrite LRU to be more Pythonic.

Until then, you'll have to update __getattribute__, __setattr__ and
__delattr__.

- Josiah
 

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,768
Messages
2,569,574
Members
45,049
Latest member
Allen00Reed

Latest Threads

Top