I want to create a Micropython-Class for an LED-Strip. When initializing, the class can be called with any number of color=Pin pairs.
So my idea was to call def __init__(self, **kwargs)
and then use:
for color, pin in kwargs.items():
setattr(self, color, PWM(Pin(pin)))
I want to refer later (e.g. to change the PWM-value with self.color.duty()
. My problem is, I don't know, how to create any kind of list of all created attributes, so I can iterate through them later on.
Thinking about something like:
for color in color_list:
color.duty(number_gained_via_mqtt)
But how can I put the created attributes into this "color_list"?
Update
Thank you for the first Answers! The Problem is, a simple list of the keys does not solve my problem. I can't call self.key_from_list (as far as I know).
E.g. if I create a liste from keys color_list=["r","g","b","w"]
I can't (or don't know how to) iterate through them.
for color in color_list:
self.color.duty(0)
will not work, because the list only contains strings and I don't know, how to call attributes of my class with that name (if that makes any sense)
The full code looks like this:
class Stripe():
def __init__(self, **kwargs):
self.on = 1
self.leds = dict()
for key, value in kwargs.items():
setattr(self, key, PWM(Pin(value)))
self.leds[key] = 255
def display(self):
if self.on:
for key in self.leds:
self.key.duty(self.leds.get(key)) # does not work
else:
for key in self.leds:
self.key.duty(0) # does not work either
Update 2 - Solved
Thank you guys for the answers. Using a dictionary instead of attributes solves the problem.
CodePudding user response:
Since your colors are the keys of kwargs
, which is a regular dictionary, you can do
self.color_list = list(kwargs.keys())
Then you can address them as
for color in self.color_list:
getattr(self, color).duty(number_gained_via_mqtt)
If you just want a list of the PWM objects, you can do that too:
self.color_list = []
for color, pin in kwargs.items():
pwm = PWM(Pin(pin))
setattr(self, color, pwm)
self.color_list.append(pwm)
Then you can do
for color in self.color_list:
color.duty(number_gained_via_mqtt)
A better option might be to store everything into a dictionary rather than the instance __dict__
, where all the attributes are mixed together:
self.colors = {color: PWM(Pin(pin)) for color, pin kwargs.items()}
Then you can access it much simpler:
for pin in self.colors.values():
pin.duty(number_gained_via_mqtt)