Welcome to the Treehouse Community
The Treehouse Community is a meeting place for developers, designers, and programmers of all backgrounds and skill levels to get support. Collaborate here on code errors or bugs that you need feedback on, or asking for an extra set of eyes on your latest project. Join thousands of Treehouse students and alumni in the community today. (Note: Only Treehouse students can comment or ask questions, but non-students are welcome to browse our conversations.)
Looking to learn something new?
Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and a supportive community. Start your free trial today.
J foriPython Development Techdegree Student 200 Points
Confusion about Keywordarguments and using *Args
hi! it's a bit confusing about this example
import random class Sneaky: sneaky = True def __init__(self, sneaky=True, *args, **kwargs): print("MRO Sneaky--> ", Sneaky.__mro__) super().__init__(args,**kwargs) self.sneaky = sneaky def hide(self, light_level): return self.sneaky and light_level < 10 class Agile: agile = True def __init__(self, agile=True ,*args ,**kwargs): print("MRO AGILE --> ", Sneaky.__mro__) super().__init__(*args,**kwargs) self.agile = agile def evade(self): return self.agile and random.randint(0, 1)
So i want to pass *Args as a argument to init() and i got this error
from thieves import Thief from attributes import Agile t=("ss",55) kenneth = Thief(name="kenneth",sneaky=True,*t)
kenneth = Thief(name="kenneth",sneaky=True,*t) TypeError: __init__() got multiple values for argument 'sneaky'
I don't get it what the relation between sneaky and *args is?
Thanks in advance
Jeff MudayTreehouse Moderator 26,897 Points
I am not sure if I am answering the question you were asking, but I am glad to see you thinking about MRO. I know it can be a little confusing. And I am not a fan of Kenneth's example of using Agile and Sneaky as attribute classes, but if you understand what he is doing you will be ready for deeper intermediate and advanced method resolution (which you will see in a future courses-- e.g. Django and Flask mixins).
*args are NOT needed in this example since all attributes set on a character other than the name will be captured in
These are VALID instantiations
kenneth1 = Thief("Kenneth", sneaky=False) kenneth2 = Thief(name="Kenneth", sneaky=False) kenneth3 = Thief(name="Kenneth", weapons=['dagger','bow'], sidekick='Picachu')
Below examples that are NOT VALID because the only required
*args parameter that is expected by the parent class is the name.
kenneth4 = Thief("Kenneth", 35, 'ss') kenneth5 = Thief(name="Kenneth", 35, 'ss') t=("ss",55) kenneth6 = Thief(name="kenneth", sneaky=True, *t)
However-- Kenneth is setting us up to adhere to best practices for working with a superclass. A superclass (or parent class) may have a number of REQUIRED arguments that need to be passed as args. And the call that is made to the
super.__init__(*args, **kwargs) is a generic way to make sure the child class can adequately pass or override all parameters expected by the parent.