2013-07-29 3 views
0

Привет Я использую API-интерфейс bloomberg (для учебных целей и не слишком релевантный для вопроса - просто как контекст).Удаление (уничтожение) объекта python изнутри функции

Часть процесса заключается в создании «запросов», которые отправляются как запросы на сервер, который отвечает.

Каждый запрос остается «живым», пока объект не будет убит. Я использую функцию для вызова данных из каждого запроса, так как это код, который я использую очень часто, и форма запроса может значительно измениться при каждом вызове.

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

вы должны вызвать del r после каждого вызова calldata(r), как это:

cleanref = calldata(r) 
del r 

del ref внутри функции только удалить ссылки внутри вашей функции.

+0

Спасибо @RomanPekar. Это похоже на тот подход, который мне придется принять. –

3

del не удаляет объекты. Он удаляет имена. Так что, когда вы звоните

del req 

Все, что вам сделать, это удалить имя req из локального пространства имен.

Объекты удаляются garbage collector. Объект, который ссылается на req, не будет удален до тех пор, пока все имена/переменные, относящиеся к объекту, не будут удалены (и даже тогда он не может быть удален, это проблема реализации). В этом случае вы можете сделать del request после звонка на calldata(request). Тем не менее, нет гарантии, что объект запроса будет удален даже тогда.

Поэтому я предлагаю вам изменить свой код, чтобы он не полагался на объекты, собранные в определенное время. Мне также непонятно, как, почему или даже если ваш код действительно полагается на это, или если вы просто предполагаете, что это так.

+0

Hi @LennartRegebro благодарит за ответ. Мне сказали, что служба поддержки BBG полагается на удаление объекта. Хотелось бы иметь простой способ убить/закрыть его, но API этого не позволяет. –

+1

@TahnoonPasha: Было бы хорошо, если бы они позволили программисту Python определить API Python. : rolleyes: –