Reputation: 11741
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
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
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