How can you set class attributes from variable arguments (kwargs) in python
Suppose I have a class with a constructor (or other function) that takes a variable number of arguments and then sets them as class attributes conditionally.
I could set them manually, but it seems that variable parameters are common enough in python that there should be a common idiom for doing this. But I'm not sure how to do this dynamically.
I have an example using eval, but that's hardly safe. I want to know the proper way to do this -- maybe with lambda?
class Foo:
def setAllManually(self, a=None, b=None, c=None):
if a!=None:
self.a = a
if b!=None:
self.b = b
if c!=None:
self.c = c
def setAllWithEval(self, **kwargs):
for key in **kwargs:
if kwargs[param] != None
eval("self." + key + "=" + kwargs[param])
You could update the __dict__
attribute (which represents the instance attributes in the form of a dictionary) with the keyword arguments:
class Bar(object):
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
then you can:
>>> bar = Bar(a=1, b=2)
>>> bar.a
1
and with something like:
allowed_keys = {'a', 'b', 'c'}
self.__dict__.update((k, v) for k, v in kwargs.items() if k in allowed_keys)
you could filter the keys beforehand (use iteritems
instead of items
if you’re still using Python 2.x).
You can use the setattr()
method:
class Foo:
def setAllWithKwArgs(self, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)
There is an analogous getattr()
method for retrieving attributes.
Most answers here do not cover a good way to initialize all allowed attributes to just one default value. So, to add to the answers given by @fqxp and @mmj:
class Myclass:
def __init__(self, **kwargs):
# all those keys will be initialized as class attributes
allowed_keys = set(['attr1','attr2','attr3'])
# initialize all allowed keys to false
self.__dict__.update((key, False) for key in allowed_keys)
# and update the given keys by their given values
self.__dict__.update((key, value) for key, value in kwargs.items() if key in allowed_keys)