2016-04-25 5 views
1

Ich habe eine YAML-Datei mit Inhalt füllen: YAML-Datei und o/p Ich habe zu laden habe in dict FormatWie Standardparameter in yaml Datei mit Python

 image_name: ubuntu 
     components: 
       image_name: ubuntu 
       image_flavors: [medium, large] 
       image_ip : 192.168.12.134 
       imageuser : ubuntu 
       image_pass : ubuntu 
       image_config: /home/ubuntu/ 
       image_net_type: vlan 
       image_switch_type: ovs 

Ich habe implementiert ein Skript dafür.

 with open("test.yaml", "r") as input: 
     try: 
      a = yaml.safe_load(input) 
      print "Parsing YAML file is completed" 
      print a 
     except yaml.YAMLError as error: 
      print(error) 

mein dict Format wie folgt:

{'image_name': 'ubuntu', 'components': {'image_ip': '192.168.12.134', 
'image_pass': 'ubuntu', 'image_switch_type': 'ovs', 'imageuser': 'ubuntu', 
'image_name': 'ubuntu', 'image_flavors': ['medium', 'large'], 
'image_net_type': 'vlan', 'image_config': '/home/ubuntu/'}} 

Wie ich Standardparameter füllen kann, wenn eine beliebige Taste, keine Werte hat?

+0

Ihre YAML-Datei enthält Schlüssel für ihre Zuordnungen, und Ihr Python-Wörterbuch verfügt ebenfalls über Schlüssel. Bitte bearbeiten Sie Ihren Post, um zu verdeutlichen, welcher der beiden als Standardparameter für den anderen verwendet werden soll. – Anthon

Antwort

0

Eine Option ist, wenn Sie einen Wert für einen Schlüssel in der Diktat erhalten, die von der Yaml geparst wurde, verwenden Sie die get() Methode des dict. so

value = a.get('key', 'default') 

Wenn der Schlüssel key in a ist, wird es den Wert zurückgeben sonst wird es zurückgeben, was Sie als Standard festlegen. In dem oben beispiel, Die 'default'

3

Hmm, meinst du so etwas wie dies würde:

default_values = { 
    'image_name': 'some', 
    'components': { 
     'image_ip': '192.168.1.1', 
     'image_pass': 'default_password', 
     'image_switch_type': 'ovs', 
     'imageuser': 'default_user', 
     'image_name': 'default_name', 
     'image_flavors': ['medium', 'large'], 
     'image_net_type': 'vlan', 
     'image_config': '/default/home/' 
    } 
} 

def setdefault_recursively(tgt, default = default_values): 
    for k in default: 
     if isinstance(default[k], dict): # if the current item is a dict, 
      # expand it recursively 
      setdefault_recursively(tgt.setdefault(k, {}), default[k]) 
     else: 
      # ... otherwise simply set a default value if it's not set before 
      tgt.setdefault(k, default[k]) 

dic = { 'image_name': 'ubuntu', 'components': { 'image_name': 'ubuntu' } 

setdefault_recursively(dic) 

?

Dies sollte Ihr dic Lesen von YAML-Datei mit Standardwerten, rekursiv füllen:

{'components': {'image_config': '/default/home/', 
      'image_flavors': ['medium', 'large'], 
      'image_ip': '192.168.1.1', 
      'image_name': 'ubuntu', 
      'image_net_type': 'vlan', 
      'image_pass': 'default_password', 
      'image_switch_type': 'ovs', 
      'imageuser': 'default_user'}, 
'image_name': 'ubuntu'} 

Das heißt, alle Einstellungen innerhalb der Struktur, die aus der YAML-Datei nicht explizit festgelegt wurden, haben die Standardwerte erhalten von default_values, uhmm, rekursiv.

+0

hallo, das obige func ist nützlich, aber sieht aus wie etwas komplexes.Können Sie es bitte ausarbeiten.Ich bin nicht in der Lage, Ihre Logik zu verstehen –