0

こんにちは、ブルームバーグ 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()、どんな助けでもありがたいです。

4

2 に答える 2

3

delオブジェクトを削除しません。名前を削除します。だからあなたが電話するとき

del req

reqローカル名前空間から名前を削除するだけです。

オブジェクトはガベージ コレクタによって削除されます。参照するオブジェクトは、そのオブジェクトreqを参照するすべての名前/変数が削除されるまで削除されません (それでも削除されない場合があります。これは実装上の問題です)。del requestこの場合、 への呼び出しの後にできることがありますcalldata(request)。ただし、それでもリクエストオブジェクトが削除されるという保証はありません。

したがって、特定の時間にガベージ コレクションされるオブジェクトに依存しないように、コードを変更することをお勧めします。また、コードが実際にこれに依存している方法、理由、または依存しているかどうか、または単に依存していると仮定するかどうかも不明です。

于 2013-07-29T10:01:59.837 に答える
2

次のように、 を呼び出すdel rたびに呼び出す必要がありますcalldata(r)

cleanref = calldata(r)
del r

del ref関数内では、関数内の参照のみを削除します。

于 2013-07-29T10:02:13.133 に答える