sedavidw
sedavidw

Reputation: 11741

Getting all constants within a class in python

I have a class which is essentially used to define common constants for other classes. It looks something like the following:

class CommonNames(object):
    C1 = 'c1'
    C2 = 'c2'
    C3 = 'c3'

And I want to get all of the constant values "pythonically". If I used CommonNames.__dict__.values() I get those values ('c1', etc.) but I get other things such as:

<attribute '__dict__' of 'CommonNames' objects>,
<attribute '__weakref__' of 'CommonNames' objects>,
None ...

Which I don't want.

I want to be able to grab all the values because this code will be changed later and I want other places to know about those changes.

Upvotes: 18

Views: 11077

Answers (2)

galgertz
galgertz

Reputation: 71

If you're trying to use Martijn example in python3, you should use items() instead of iteritmes(), since it's deprecated

[value for name, value in vars(CommonNames).items() if not name.startswith('_')]

Upvotes: 7

Martijn Pieters
Martijn Pieters

Reputation: 1124558

You'll have to filter those out explicitly by filtering on names:

[value for name, value in vars(CommonNames).iteritems() if not name.startswith('_')]

This produces a list of values for any name not starting with an underscore:

>>> class CommonNames(object):
...     C1 = 'c1'
...     C2 = 'c2'
...     C3 = 'c3'
... 
>>> [value for name, value in vars(CommonNames).iteritems() if not name.startswith('_')]
['c3', 'c2', 'c1']

For enumerations like these, you'd be better of using the enum34 backport of the new enum library added to Python 3.4:

from enum import Enum

class CommonNames(Enum):
    C1 = 'c1'
    C2 = 'c2'
    C3 = 'c3'

values = [e.value for e in CommonNames]

Upvotes: 24

Related Questions