我意识到这可能是一个非常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)
那么它是如何知道在这一点上要做什么的呢?这个“事件”对象是如何神奇地出现的?
谢谢你给我那些愚蠢的问题
发布于 2019-06-06 06:21:56
session = blpapi.Session(sessionOptions, eventHandler.processEvent)
注意,这里的processEvent
后面没有括号()
。这意味着您将函数本身作为参数传递给Session
类。该类稍后将使用适当的参数调用processEvent
。
旁注:
我仍然在理解函数式编程方面有困难
“函数式编程”有一个非常具体的定义,这个例子不是这样的。如果你感兴趣,你可以谷歌“函数式编程”或阅读维基百科的文章来了解更多。然而,在学习过程的这个阶段,这并不是真正重要的。
https://stackoverflow.com/questions/56468724
复制相似问题