您好我正在使用bloomberg API(用于学习目的,与问题不太相关 - 仅作为上下文)。
部分过程是创建“请求”,将其作为查询发送给响应的服务器。
每个查询都保持“活动”状态,直到对象被终止。我正在使用一个函数来调用每个请求中的数据,因为这是我经常使用的代码,并且每次调用时请求的形状都会发生很大变化。
def calldata(req): # doesnt currently work. Dont know why
session.sendRequest(req)
while True:
ev = session.nextEvent()
tmp = []
if ev.eventType() == blpapi.Event.RESPONSE or blpapi.Event.PARTIAL_RESPONSE:
for msg in ev:
if msg.hasElement('securityData'):
data = msg.getElement('securityData')
tmp.append(data)
break
del req
return(tmp)
其中req可以是例如
# Data for clean multiple data ::= cleanref
r = svc.createRequest('ReferenceDataRequest')
r.append('securities','MSFT US Equity')
r.append('fields','bid')
cleanref = calldata(r)
# Dirty reference for multiple data - both bad security and bad field
# ::= errorref
req = svc.createRequest("ReferenceDataRequest")
req.append('securities','Rhubarb Curncy')
req.append('fields','PX_LAST')
req.append('securities','SGD Curncy')
req.append('fields','desc')
errorref= calldata(req)
# Historical data request ::= histdata
request = svc.createRequest("HistoricalDataRequest")
request.getElement("securities").appendValue("IBM US Equity")
request.getElement("securities").appendValue("MSFT US Equity")
request.getElement("fields").appendValue("PX_LAST")
request.getElement("fields").appendValue("OPEN")
request.set("periodicityAdjustment", "ACTUAL")
request.set("periodicitySelection", "MONTHLY")
request.set("startDate", "20060101")
request.set("endDate", "20061231")
request.set("maxDataPoints", 100)
histdata = calldata(request)
# erroneous historical data request ::= histerr
requ = svc.createRequest("HistoricalDataRequest")
requ.getElement("securities").appendValue("IBM US Equity")
requ.getElement("securities").appendValue("MSFT US Equity")
requ.getElement("fields").appendValue("PX_LAST")
requ.getElement("fields").appendValue("Desc")
requ.set("periodicityAdjustment", "ACTUAL")
requ.set("periodicitySelection", "MONTHLY")
requ.set("startDate", "20060101")
requ.set("endDate", "20061231")
requ.set("maxDataPoints", 100)
histerr = calldata(requ)
所以我需要杀死函数中的每个请求才能重用它,我无法弄明白。我怀疑这可能与locals()
有关,但任何帮助都会感激不尽。
答案 0 :(得分:3)
del
不会删除对象。它删除了名字。所以当你打电话时
del req
您只需从本地命名空间中删除名称req
。
garbage collector删除对象。在引用该对象的所有名称/变量都被删除之前,req
引用的对象将不会被删除(即使这样,它也可能不被删除,这是一个实现问题)。在这种情况下,您可以在致电del request
后执行calldata(request)
。但是,即使这样,也无法保证请求对象被删除。
因此,我建议您更改代码,使其不依赖于在特定时间进行垃圾回收的对象。我也不清楚你的代码是如何,为什么,甚至你的代码实际上依赖于它,或者你只是假设它。
答案 1 :(得分:2)
每次致电del r
后,您都必须致电calldata(r)
,如下所示:
cleanref = calldata(r)
del r
函数内的 del ref
仅删除函数内的引用。