PyYAML path at serialization time vs deserialization time
Question: I am working on a game engine which includes a simple GUI development tool.
The GUI tool allows a user to define various entities and components, which
can then be saved in a configuration file. When the game engine runtime loads
the configuration file, it can determine how to create the various entities
and components for use in the game.

For a configuration file saving mechanism, I am using PyYAML. The issue that I
am having stems from the fact that the serialization process occurs in a
module which is in a different directory than the module which loads and
parses the file through PyYAML.

**Simplified Serializer**

    
    
    import yaml
    
    def save_config(context, file_name):
        config_file = file(file_name, 'w')
        # do some various processing on the context dict object
        yaml.dump(context, config_file)
        config_file.close()
    

This takes the `context` object, which is a `dict` that represents various
game objects, and writes it to a config file. This works without issue.

**Simplified Deserializer in engine**

    
    
    import yaml
    
    def load(file_name):
        config_file = open(file_name, 'r')
        context = yaml.load(config_file)
        return context
    

This is where the problem occurs. On `yaml.load(config_file)`, I will receive
an error, because it fails to find a various name on a certain module. I
understand why this is happening. For example, when I serialize the config
file, it will list an `AssetComponent` (a component type in the engine) as
being at `engine.common.AssetComponent`. However, from the deserializer's
perspective, the `AssetComponent` should just be at `common.AssetComponent`
(because the deserialization code itself exists within the `engine` package),
so it fails to find it under `engine`.

Is there a way to manually handle paths when serializing or deserializing with
PyYAML? I would like to make sure they both happen from the same
"perspective."

**Edit:** The following shows what a problematic config file might look like,
followed by what the manually corrected config would look like

**Problematic**

    
    
    !!python/object/apply:collections.defaultdict
    args: [!!python/name:__builtin__.dict ''] 
    dictitems:
      assets:
      - !!python/object:common.Component
        component: !!python/object:engine.common.AssetComponent {file_name: ../content/sticksheet.png,
          surface: null}
        text: ../content/sticksheet.png
        type_name: AssetComponent
    

**Corrected**

    
    
    !!python/object/apply:collections.defaultdict
    args: [!!python/name:__builtin__.dict ''] 
    dictitems:
      assets:
      - !!python/object:tools.common.Component
        component: !!python/object:common.AssetComponent {file_name: ../content/sticksheet.png,
          surface: null}
        text: ../content/sticksheet.png
        type_name: AssetComponent
    


Answer: You can explicitly [declare the Python type of an
object](http://pyyaml.org/wiki/PyYAMLDocumentation#Objects) in a YAML
document:

    
    
    !!python/object:module_foo.ClassFoo {
        attr_foo: "spam",
        …,
    }
    

