首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >试图理解函数式参数

试图理解函数式参数
EN

Stack Overflow用户
提问于 2019-06-06 06:12:35
回答 1查看 68关注 0票数 0

我意识到这可能是一个非常101类型的问题,但我仍然在理解函数式编程方面存在问题,并且有一个我无法理解的特定代码片段:

完整的代码,但省略了大部分函数定义:

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()

我可以按照下面的代码来做:

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

在这里,我看到我正在从blpapi库中调用"Session“,并将一些选项和我的eventHandler.processEvent传递给它。这就是我迷路的地方。我查看了这个特定的函数,并看到:

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

我看到该函数试图辨别传入的是哪种类型的事件,并将根据该事件类型在类中执行不同的函数。问题是,我不知道事件是在哪里指定的!“事件”从何而来?我将其视为该特定函数中的一个参数,但没有将事件参数传递给:

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

那么它是如何知道在这一点上要做什么的呢?这个“事件”对象是如何神奇地出现的?

谢谢你给我那些愚蠢的问题

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-06 06:21:56

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

注意,这里的processEvent后面没有括号()。这意味着您将函数本身作为参数传递给Session类。该类稍后将使用适当的参数调用processEvent

旁注:

我仍然在理解函数式编程方面有困难

“函数式编程”有一个非常具体的定义,这个例子不是这样的。如果你感兴趣,你可以谷歌“函数式编程”或阅读维基百科的文章来了解更多。然而,在学习过程的这个阶段,这并不是真正重要的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56468724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档