Me parece un lugar bueno para usar los objetos que se puede llamar, los que definen __call__()
, es decir cuando se utilizan las capacidades de programación en Python funcionales, tales como map()
, filter()
, reduce()
.
El mejor momento para usar un objeto invocable sobre una función simple o una función lambda es cuando la lógica es compleja y necesita retener algún estado o utiliza otra información que no se pasa a la __call__()
función.
Aquí hay un código que filtra los nombres de archivos según su extensión de nombre de archivo utilizando un objeto invocable y filter()
.
Llamable:
import os
class FileAcceptor(object):
def __init__(self, accepted_extensions):
self.accepted_extensions = accepted_extensions
def __call__(self, filename):
base, ext = os.path.splitext(filename)
return ext in self.accepted_extensions
class ImageFileAcceptor(FileAcceptor):
def __init__(self):
image_extensions = ('.jpg', '.jpeg', '.gif', '.bmp')
super(ImageFileAcceptor, self).__init__(image_extensions)
Uso:
filenames = [
'me.jpg',
'me.txt',
'friend1.jpg',
'friend2.bmp',
'you.jpeg',
'you.xml']
acceptor = ImageFileAcceptor()
image_filenames = filter(acceptor, filenames)
print image_filenames
Salida:
['me.jpg', 'friend1.jpg', 'friend2.bmp', 'you.jpeg']