2016-05-17 1 views
0

je le Python suivant:PyYAML YAML load_all aux objets (joliment)

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") 

Et la YAML suivante:

!!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'] 

Ce que je veux est un dict d'instruments, donc je peux faire instruments['vstoxx'].quandl_get() . En prime, je ne souhaite pas répéter !!python/object:v.Instrument à chaque fois dans le fichier YAML.

Actuellement, j'ai une liste d'instruments. Je pense que je dois faire deux étapes, charger les objets dans une liste, puis les mapper à un dict. Est-ce vraiment le moyen le plus propre?

Répondre

0

Si vous utilisez load_all et plusieurs documents dans votre fichier (ce que vous faites en utilisant ---), vous obtenez toujours une liste d'éléments de données distincts.

Ce que vous pouvez faire est de changer le fichier 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'il vous plaît ne pas la ligne du dessus comprend un s à la fin), puis mettre en œuvre une classe Instruments que lorsque son obtient YAML chargé crée la Instrument individuelle instances et les remplit, et a un attribut self._lookup qui stocke les paires clé-valeur (valeur étant l'instance de Instrument). Puis sur Instruments créer:

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