vendredi 13 avril 2018

Reading YAML files and accessing lists

I am currently reading data from a .yml file. Inside the file is the following part for every main entry:

- !
  name: Martial Focus
  prerequisites:
    tier1:
      any:
        Attribute:
        - Attribute1:§ 1
        - Attribute2:§ 1
        Feat:
        - Feat1
        Other:
        - Other Prerequisites
  cost:
  - 3
  description: |
    [...]
  effect: |
    [...]

I've been able to read all the data, including prerequisites, but here I have a special problem: Where with the other data, I was able to access sublists it seems to be different for this:

The "any:" part is optional, so it could also say something like

prerequisites:
    tier1:
      Attribute:
      - Attribute1:§ 1
      - Attribute2:§ 1
      Feat:
      - Feat1
      Other:
      - Other Prerequisites

Reading the .yml file converts the part above to

'prerequisites': {
  'tier1': {
    'any': {
      'Attribute': ['Attribute1:§ 1', 'Attribute2:§ 1'],
      'Feat': ['Feat1'],
      'Other': ['Other Prerequisites']
    }
  }
}

So in my code, for every "tierX", I check if it contains a "any:" via

if 'any' in tier:
  # do the stuff to be done if 'any' exists
else:
  # do the stuff to be done if it doesn't

But it never seems to be true. Since "Attribute:", "Feat:" and "Other:" are also optional, I do the same for those inside the if-statement and it'S the same problem with them though for those there's no else-statement. Below you can find the code I'm using. It won't be the prettiest since I litterally started with python today but I hope that you'll help me anyway:

        prerequisites = ""
        tierNum = 0
        for tier in data['prerequisites']:
            tierNum += 1
            thisTier = ""
            if 'any' in tier:
                print("'any' found!")
                content = tier['any']
                if 'Other' in content:
                    other = ""
                    for s2 in content['Other'][:-1]:
                        other += s2 + ", "
                    thisTier += "**" + other
                    if len(content['Other'][:-1]) == 0:
                        thisTier += str(content['Other'][-1:])
                    else:
                        thisTier += "or " + str(content['Other'][-1:])

                    if 'Attribute' in content:
                        attributes = ""
                        for s2 in content['Attribute'][:-1]:
                            attributes += s2 + ", "
                        if thisTier.length() == 0:
                            thisTier += "**" + attributes
                        else:
                            thisTier += ", or " + attributes
                        if len(content['Attribute'][:-1]) == 0:
                            thisTier += str(content['Attribute'][-1:])
                        else:
                            thisTier += "or " + str(content['Attribute'][-1:])

                    if 'Feat' in content:
                        feats = ""
                        for s2 in content['Feat'][:-1]:
                            feats += s2 + ", "
                        if thisTier.length() == 0:
                            thisTier += "**" + feats
                        else:
                            thisTier += ", or " + feats
                        if len(content['Feat'][:-1]) == 0:
                            thisTier += str(content['Feat'][-1:])
                        else:
                            thisTier += "or " + str(content['Feat'][-1:])

            else:
                content = tier
                if 'Other' in content:
                    other = ""
                    for s2 in content['Other'][:-1]:
                        other +=  s2 + ", "
                    thisTier += "**" + other
                    if len(content['Other'][:-1]) == 0:
                        thisTier += str(content['Other'][-1:])
                    else:
                        thisTier += "or " + str(content['Other'][-1:])

                if 'Attribute' in content:
                    attributes = ""
                    for s2 in content['Attribute'][:-1]:
                        attributes += s2 + ", "
                    thisTier += "**" + attributes
                    if len(content['Attribute'][:-1]) == 0:
                        thisTier += str(content['Attribute'][-1:])
                    else:
                        thisTier += "or " + str(content['Attribute'][-1:])

                if 'Feat' in content:
                    feats = ""
                    for s2 in content['Feat'][:-1]:
                        feats += s2 + ", "
                    thisTier += "**" + feats
                    if len(content['Feat'][:-1]) == 0:
                        thisTier += str(content['Feat'][-1:])
                    else:
                        thisTier += "or " + str(content['Feat'][-1:])

            prerequisites += "*Tier {0}:\n{1}\n".format(tierNum, thisTier)
        prerequisites = prerequisites[:-1]

I'm doing stuff like the content['Feat'][:-1] in order to get every element except the last so I can add a ", or " in front of the last element, should there be more than one.

Aucun commentaire:

Enregistrer un commentaire