Is crawling the stack "bad"? Why?

Russell Warren russandheather at gmail.com
Sun Feb 24 23:18:14 EST 2008


Argh... the code wrapped... I thought I made it narrow enough.  Here
is the same code (sorry), but now actually pasteable.

---

import SimpleXMLRPCServer, xmlrpclib, threading, sys

def GetCallerNameAndArgs(StackDepth = 1):
  """This function returns a tuple (a,b) where:
    a = The name of the calling function
    b = A dictionary with the arg values in order
  """
  f = sys._getframe(StackDepth + 1) #+1 to account for this call
  callerName = f.f_code.co_name
  #get the arg count for the frame...
  argCount = f.f_code.co_argcount
  #get a tuple with the local vars in the frame (args first)...
  localVars = f.f_code.co_varnames
  #now get the tuple of just the args...
  argNames = localVars[:argCount]
  #now to make a dictionary of args and values...
  argDict = {}
  for key in argNames:
    argDict[key] = f.f_locals[key]
  return (callerName, argDict)

def GetRpcClientConnectionInfo():
  #Move up the stack to the location to figure out client info...
  requestHandler = GetCallerNameAndArgs(4)[1]["self"]
  usedSocket = requestHandler.connection
  return str(usedSocket.getpeername())

def StartSession():
  return "RPC call came in on: %s" % GetRpcClientConnectionInfo()

class DaemonicServerLaunchThread(threading.Thread):
    def __init__(self, RpcServer, **kwargs):
        threading.Thread.__init__(self, **kwargs)
        self.setDaemon(1)
        self.server = RpcServer
    def run(self):
        self.server.serve_forever()

rpcServer = SimpleXMLRPCServer.SimpleXMLRPCServer(("", 12390), \
                                                logRequests = False)
rpcServer.register_function(StartSession)
slt = DaemonicServerLaunchThread(rpcServer)
slt.start()

sp = xmlrpclib.ServerProxy("http://localhost:12390")
print sp.StartSession()



More information about the Python-list mailing list