Hi Michael,
Thank you very much for such a carefully thought out reply. I
particularly enjoyed your examples illustrating your thought process.
It shed light on considerations which I had not previously thought
about. Clearly it is a balancing act between what is best for
simplistic usages like I'm accustomed to and what scales cleanly for
more enterprise style use cases.
> So this led me to this alternative set of possibilities:
>
> class TCPClient(Axon.Component.component):
> delay = 0
> connect_timeout = 60
> def __init__(self, host, port, **kwargs):
> super(TCPClient, self).__init__(**kwargs)
> self.CSA = None
> self.sock = None
> self.howDied = None
> self.host = host
> self.port = port
>
> class Port80Client_Declarative(TCPClient):
> port = 80
> def __init__(self, host, **kwargs):
> port = kwargs.pop("port", self.port)
> super(Port80Client_Declarative, self).__init__(host, port, **kwargs)
>
> class KamaeliaWebsiteClient_Declarative(Port80Client):
> host = "www.kamaelia.org"
> def __init__(self, **kwargs):
> host = kwargs.pop("host", self.host)
> super(KamaeliaWebsiteClient_Declarative, self).__init__(host, **kwargs)
> ...
I do prefer this more explicit alternative. Mainly it is the more
explicit nature of actually instantiating TCPClient or Port80Client or
KamaeliaWebsiteClient that appeals to me. I don't necessarily find
value in the more explicit parameters passed to the super().__init__
call. [More on that after a quick question]
> The only downside of all this really is that it prevents this:
> TCPClient(host="www.kamaelia.org", port="80")
Why is this not possible? My eyeball interpreter doesn't see any
reason why that would not work with what you've written.
> I have indeed, and as you'll see I've taken your thoughts on board, and I
> think reached a similar conclusion :-)
Thank you very much indeed. I greatly appreciate your explanations.
May I suggest a slight variant on your proposed alternative? This
variant retains the more explicit instantiations (__init__ calls from
user code) while allowing a bit of the magic back in for inheritance
(__init__ calls via super).
class TCPClient(Axon.Component.component):
delay = 0
connect_timeout = 60
def __init__(self, host, port, **kwargs):
super(TCPClient, self).__init__(**kwargs)
self.CSA = None
self.sock = None
self.howDied = None
self.host = host
self.port = port
class Port80Client_Declarative(TCPClient):
port = 80
def __init__(self, host, **kwargs):
kwargs.setdefault("port", self.port)
kwargs['host'] = host
# Or if >= py 2.4
# kwargs.update(host=host)
super(Port80Client_Declarative, self).__init__(**kwargs)
class KamaeliaWebsiteClient_Declarative(Port80Client):
# this variation moves the default declaration fully into the init
def __init__(self, **kwargs):
kwargs.setdefault("host", "www.kamaelia.org")
super(KamaeliaWebsiteClient_Declarative, self).__init__
(**kwargs)
...
This alternative would help users understand the fundamentally
required arguments (from reading or IDE tooltips / autocompletion)
while allowing relatively easy parent initialization.
> Apologies for the delay, but I really did need a holiday ;-) :-)
No worries! I really need a holiday myself so I can fully appreciate
how necessary some away time can be.
Thanks,
Steve
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"kamaelia" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/kamaelia?hl=en
-~----------~----~----~----~------~----~------~--~---