\$\begingroup\$
\$\endgroup\$
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?
asked Jul 9, 2013 at 9:02
1 Answer 1
\$\begingroup\$
\$\endgroup\$
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:
...
answered Jul 9, 2013 at 9:19
lang-py