Dynamic object creation in Python I want to abstract away differences between zipfile and rarfile modules. In my code i want to call ZipFile or RarFile constructors depending on file format. Currently i do it like that.

def extract(dir, f, archive_type):
    '''
    archive_type should be 'rar' or 'zip'
    '''
    images = []

    if archive_type == 'zip':
        constructor = zipfile.ZipFile
    else:
        constructor = rarfile.RarFile

    with directory(dir):
        with constructor(encode(f)) as archive:
            archive.extractall()
        os.remove(f)
        images = glob_recursive('*')

    return images


Is there any more elegant way for dynamic object calling?
Classes are first-class objects in Python.

amap = {
  'zip': zipfile.ZipFile,
  'rar': rarfile.RarFile
}

 ...

with amap[archive_type](encode(f)) as archive:
   ...


or

with amap.get(archive_type, rarfile.RarFile)(encode(f)) as archive:
   ...