[Discussion] Dépendances optionnelles pour lecteurs de données ?
Dans la présentation de la lib4P des 4P Meetings, nous avons indiqué ne pas fournir de méthodes user-friendly de type read() à partir des métadonnées des données (image, donnée LiDAR, etc.) L'une des raisons étant la diversité des possibilités (OpenCV, PIL, etc.), toutes étant valables. En outre, cela apporterait trop de dépendances à cette bibliothèque.
Néanmoins, il semblerait qu'il soit possible d'ajouter des dépendances optionnelles, évitant ainsi la dépendance forte à telle ou telle bibliothèque ne servant qu'à lire la donnée finale. Cependant, il faudrait une certaine réflexion sur la façon dont implémenter dans le code cette possible diversité. Il doit être faisable de détecter la présence de telle ou telle bibliothèque, mais vient alors la question du "que faire si on détecte plusieurs bibliothèques valides pour la lecture de la données D ?". Est-ce qu'on pré-défini un ordre préférentiel d'utilisation ? Quel ordre ? Ou bien est-ce qu'on force l'utilisateur à spécifier la bibliothèque-lecteur dans la méthode de lecture (ex: *.read("my_file.ext", reader="OpenCV")) ?
Une telle implémentation risque, au premier abord, de faire tendre vers des comportements potentiellement "étranges". En effet, un utilisateur A utilisant la bibliothèque-lecteur a aura entre les mains un objet (//donnée lue) sensiblement différent que l'utilisateur B utilisant la bibliothèque-lecteur b, et par conséquent observer des comportements différents pour un code semblant identique sinon similaire.
# ...
image_1 = metadata.get_images()[0].read(reader="OpenCV")
image_2 = metadata.get_images()[0].read(reader="PIL")
image_3 = metadata.get_images()[0].read() # default reader
print(image_1.shape) # OK, ex: '(2044, 2040, 3)'
print(image_2.shape) # AttributeError: 'TiffImageFile' object has no attribute 'shape'. Did you mean: 'save'?
print(image_3.shape) # default reader dependent: dependent on installed third-party libraries and selection order
Une solution peut être de proposer un seul lecteur (ex: via OpenCV), dont la dépendance serait optionnelle. Si l'utilisateur installe la bibliothèque avec la dépendance (ex: lib4P[opencv]), ou si cette dernière était déjà installée, il pourrait alors utiliser les fonctions read(). Dans le cas contraire, une erreur lui serait renvoyé et il se verrait obliger d'aller lire lui même "manuellement" la donnée.
import cv2
# ...
image = cv2.imread(metadata.get_images()[0].get_filename())