简体   繁体   中英

filling up a list python

THanks for looking into my post. I guess I have a probably a pretty simple doubt by this community standards.. but pardon me if it is too simple. I am trying to learn python. So anyways.. I have an object which can have five attributes. So lets say when i am initializing the class its like this

class Foo:
    def __init__ (self, argA = None, argB = None, argC = None, argD = None....)

and somewhere I have this method called get features

    def getFeatures(self):
     x = [self._argA, self._argB, self._argc... and so on]

so basically I am trying to put all these features into a list. But here is the problem. During initialization, as you can see all the parameters are optional.. but when I do getFeatures, I only want those features which are initialzed Now a naive way is to write a big if else statement but as Scott Myers wrote in is book.. anytime you see yourself writign a code " if object is of type A do something and if object is of type B do something else... then slap your self.." What is a good way to getFeatures whcih contains only the elements which are initialized. Thanks

def getFeatures(self):
    return [field for field in (self._argA, ..., self._argE) if field is not None]

Keep a dictionary of feature name to boolean enabled/disabled. That's much better than having all these variables floating around.

def __init__(self, **kwargs):
    self.features = kwargs

def getFeatures(self):
    return {feature for feature, isEnabled in self.features.items() if isEnabled}

Example:

>>> class Foo(object):
...     def __init__(self, **kwargs):
...             self.features = kwargs
...     
...     def getFeatures(self):
...             return {feature for feature, isEnabled in self.features.items() if isEnabled}
... 
>>> x = Foo(red=True, yellow=False, green=True)
>>> x.getFeatures()
set(['green', 'red'])

All attributes can be found in __dict__ attribute of an object as a dictionary (keys->attribute names, values->attribute values). You can filter the uninitialized variables by list comprehension and filtering uninitialized attributes:

def get_initialized_attrs(self):
     return [elem for elem in self.__dict__.values() if elem != None]

You may also want to gather attributes with a certain type such as string( "str" ), integers( "int" ) etc.:

def get_initialized_attrs_bytype(self, type_name):
    return [elem for elem in self.__dict__.values() \
                     if elem != None and type(elem).__name__ == type_name]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM