David Yang
David Yang

Reputation: 2141

Attempting to Understand Functional Arguments

I recognize this may be a very 101 type question, but I'm still having trouble understanding functional programming in general, and have a particular code snippet that I can't make sense of:

Full code, but leaving out most of the function definitions:

import blpapi
import sys

SESSION_STARTED         = blpapi.Name("SessionStarted")
SESSION_STARTUP_FAILURE = blpapi.Name("SessionStartupFailure")
SERVICE_OPENED          = blpapi.Name("ServiceOpened")
SERVICE_OPEN_FAILURE    = blpapi.Name("ServiceOpenFailure")
ERROR_INFO              = blpapi.Name("ErrorInfo")
GET_FILLS_RESPONSE      = blpapi.Name("GetFillsResponse")

d_service="//blp/emsx.history"
d_host="localhost"
d_port=8194
bEnd=False

class SessionEventHandler():

    def processEvent(self, event, session):
        try:
            if event.eventType() == blpapi.Event.SESSION_STATUS:
                self.processSessionStatusEvent(event,session)

            elif event.eventType() == blpapi.Event.SERVICE_STATUS:
                self.processServiceStatusEvent(event,session)

            elif event.eventType() == blpapi.Event.RESPONSE:
                self.processResponseEvent(event)

            else:
                self.processMiscEvents(event)

        except:
            print ("Exception:  %s" % sys.exc_info()[0])

        return False


    def processSessionStatusEvent(self,event,session):
        print ("Processing SESSION_STATUS event")

        for msg in event:
            pass

    def processServiceStatusEvent(self,event,session):
        print ("Processing SERVICE_STATUS event")

        for msg in event:
            pass

    def processResponseEvent(self, event):
        print ("Processing RESPONSE event")

        for msg in event:

            global bEnd
            bEnd = True

    def processMiscEvents(self, event):

        print ("Processing " + event.eventType() + " event")

        for msg in event:

            print ("MESSAGE: %s" % (msg.tostring()))


def main():

    sessionOptions = blpapi.SessionOptions()
    sessionOptions.setServerHost(d_host)
    sessionOptions.setServerPort(d_port)

    print ("Connecting to %s:%d" % (d_host,d_port))

    eventHandler = SessionEventHandler()

    session = blpapi.Session(sessionOptions, eventHandler.processEvent)

    if not session.startAsync():
        print ("Failed to start session.")
        return

    global bEnd
    while bEnd==False:
        pass

    session.stop()

I can follow the code up to here:

session = blpapi.Session(sessionOptions, eventHandler.processEvent)

Here, I see I'm calling "Session" from the blpapi library, and passing it some options as well as my eventHandler.processEvent. Here is where I get lost. I look at that particular function, and see:

def processEvent(self, event, session):
    try:
        if event.eventType() == blpapi.Event.SESSION_STATUS:
            self.processSessionStatusEvent(event,session)

        elif event.eventType() == blpapi.Event.SERVICE_STATUS:
            self.processServiceStatusEvent(event,session)

        elif event.eventType() == blpapi.Event.RESPONSE:
            self.processResponseEvent(event)

        else:
            self.processMiscEvents(event)

    except:
        print ("Exception:  %s" % sys.exc_info()[0])

    return False

I see that the function is attempting to discern what type of event has been passed in, and will execute a different function within the class depending on that event type. The trouble is, I can't figure out where the event is ever specified! Where does "event" come from? I see it as an argument in that particular function, but no event argument was passed to:

session = blpapi.Session(sessionOptions, eventHandler.processEvent)

So how does it know what to do at this point? How did this "event" object magically appear?

Thanks for entertaining my dumb questions

Upvotes: 0

Views: 125

Answers (1)

Code-Apprentice
Code-Apprentice

Reputation: 83527

session = blpapi.Session(sessionOptions, eventHandler.processEvent)

Note that processEvent here lacks parentheses () after it. This means you are passing the function itself as a parameter to the Session class. This class will later call processEvent with appropriate parameters.

Side Note:

I'm still having trouble understanding functional programming

"Functional programming" has a very specific definition and this example isn't it. If you are interested, you can google "functional programming" or read the Wikipedia article to find out more. However, this isn't really important at this stage in your learning process.

Upvotes: 1

Related Questions