从函数内部删除(查杀)python对象

时间:2013-07-29 09:48:05

标签: python function object bloomberg

您好我正在使用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()有关,但任何帮助都会感激不尽。

2 个答案:

答案 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仅删除函数内的引用。