improve this newbie code/nested functions in Python?
Esmail
ebonak at gmail.com
Fri Mar 20 16:19:30 EDT 2009
On Mar 20, 2:02 pm, prueba... at latinmail.com wrote:
> On Mar 19, 10:21 pm, Esmail <ebo... at gmail.com> wrote:
>
>
>
> > Hi,
>
> > I'm new to writing Python code. This is a simple client I wrote, it
> > works, but I feel it doesn't look as clean as it could. Can anyone
> > make suggestions how to streamline this code?
>
> > Also, I am using two nested functions, it seems that nested functions
> > aren't used that much in Python - is that correct? And if so, how
> > come?
>
> > thanks,
>
> > Esmail
>
> > ps: I realize there is minimal error checking/exception handling.
>
> > #!/usr/bin/env python
>
> > import sys
> > from socket import *
> > from threading import Thread
>
> > class Client(object):
> > def __init__(self, host="localhost", port=5555, name = "esmail"):
> > self._host = host
> > self._port = port
> > self._name = name
> > self._address=(self._host, self._port)
> > self._sock=socket(AF_INET, SOCK_STREAM)
> > self._sock.connect(self._address)
> > self._parent = self
> > self._keepGoing = True
>
> > def info(self):
> > return self._host, self._port, self._name
>
> > class Listener(Thread):
> > def __init__(self, parent, tname="listener"):
> > Thread.__init__(self,name = tname)
> > self._parent = parent
> > print self._parent._host
>
> > def run(self):
>
> > while self._parent._keepGoing:
> > m = self._parent._sock.recvfrom(1024)
> > print m[0]
>
> > class Speaker(Thread):
> > def __init__(self, parent, tname = "speaker"):
> > Thread.__init__(self,name = tname)
> > self._parent = parent
> > self._parent._sock.send(self._parent._name + "\n")
>
> > def run(self):
>
> > while(True):
> > m = raw_input("-> ")
> > if m == "bye":
> > self._parent._sock.send(self._parent._name + " is
> > signing off.\n")
> > self._parent._sock.send("bye\n")
> > self._parent._keepGoing = False
> > break;
> > else:
> > self._parent._sock.send(m + "\n")
>
> > def main():
>
> > if len(sys.argv) == 4: # prog name + 3 args
> > host = sys.argv[1]
> > port = int(sys.argv[2])
> > name = sys.argv[3]
> > c = Client(host, port, name)
> > else:
> > c = Client()
>
> > print "Client connecting to - host=%s port=%d name=%s" % c.info
> > ()
>
> > s = Client.Speaker(c)
> > s.start()
>
> > l = Client.Listener(c)
> > l.start()
>
> > main()
>
> How about renaming the Client to SocketConfig, Listener to
> ClientListener and Speaker to ClientSpeaker and put all at the same
> level. The you can do this:
>
> c = SocketConfig(host, port, name)
> s = ClientSpeaker(c)
> l = ClientListener(c)
>
> the other option would be to create a Speaker and Listener factory in
> Client that returns Speakers and Listeners so you can do:
>
> c = Client(host, port, name)
> s = c.Speaker()
> l = c.Listener()
Ah .. I like both .. will probably do the first one (easier) but
keep the 2nd one in mind. Thanks!!
Esmail
More information about the Python-list
mailing list