2016-05-17 65 views
0

我有以下的Python:PyYAML YAML load_all的數據類型,以對象(很好)

class Instrument: 
    def quandl_get(self): 
     return quandl.get(self.quandl) 

def yaml_load_all(name): 
    with open('yaml/' + str(name) + '.yaml', 'r') as ymlfile: 
     return list(yaml.load_all(ymlfile)) 

instruments = yaml_load_all("instruments") 

而下面的YAML:

!!python/object:v.Instrument 
vstoxx: 
    fractional_contracts: False 
    multiplier: 100 
    slippage: 0.0017 
    per_contract_cost: 0.0211 
    quandl: 'CHRIS/EUREX_FVS1' 
--- 
!!python/object:v.Instrument 
corn: 
    multiplier: 5000 
    symbol: 'zc' 
    months_traded: [3, 5, 7, 9, 12] 
    quandl: 'CHRIS/CME_C2' 
    forecasts: ['ewmac'] 

我要的是儀器的字典,所以我可以做instruments['vstoxx'].quandl_get()

作爲獎勵,我不想在YAML文件中每次重複!!python/object:v.Instrument

目前我收到了一個樂器列表。我想我需要執行兩個步驟,將對象加載到列表中,然後將它們映射到字典。這真的是最乾淨的方式嗎?

回答

0

如果在文件中使用load_all和多個文檔(使用---執行此操作),則始終會獲取單獨數據元素的列表。

你可以做什麼是YAML文件更改爲:

!!python/object:v.Instruments 
vstoxx: 
    fractional_contracts: False 
    multiplier: 100 
    slippage: 0.0017 
    per_contract_cost: 0.0211 
    quandl: 'CHRIS/EUREX_FVS1' 
corn: 
    multiplier: 5000 
    symbol: 'zc' 
    months_traded: [3, 5, 7, 9, 12] 
    quandl: 'CHRIS/CME_C2' 
    forecasts: ['ewmac'] 

(請不背線包括s末),然後實現類Instruments,當它變得YAML加載創建個人Instrument實例並填充它們,並具有存儲鍵值對(值爲Instrument的實例)的屬性self._lookup。然後在Instruments創建:

__getitem__(self, key): 
    return self._lookup[key]