Ne vous répétez pas#

Parfois, nous copions et collons du code plusieurs fois pour traiter rapidement des images. À long terme, cette duplication de code n’est pas bonne pour la qualité du code, car si nous voulons changer quelque chose, nous devons le faire à plusieurs endroits et risquons d’en oublier certains. Ainsi, éviter le code répétitif est essentiel. Le principe de conception logicielle s’appelle Ne vous répétez pas.

import pyclesperanto_prototype as cle
image = cle.imread("../../data/BBBC007_batch/17P1_POS0013_D_1UL.tif")
labels = cle.voronoi_otsu_labeling(image, spot_sigma=3)
number_of_nuclei = labels.max()
number_of_nuclei
44.0
image = cle.imread("../../data/BBBC007_batch/20P1_POS0005_D_1UL.tif")
labels = cle.voronoi_otsu_labeling(image, spot_sigma=3)
number_of_nuclei = labels.max()
number_of_nuclei
41.0
image = cle.imread("../../data/BBBC007_batch/20P1_POS0007_D_1UL.tif")
labels = cle.voronoi_otsu_labeling(image, spot_sigma=3)
number_of_nuclei = labels.max()
number_of_nuclei
73.0

Si nous voulions maintenant voir comment la modification du paramètre spot_sigma ci-dessus influence le résultat, nous devrions changer cette valeur trois fois. Lorsque le code devient encore plus long, il peut arriver que nous oubliions de le changer à un endroit.

Boucles for au lieu de répétition de code#

Une façon d’éviter la répétition de code consiste à utiliser des boucles for.

folder = "../../data/BBBC007_batch/"
files = ["17P1_POS0013_D_1UL.tif",
        "20P1_POS0005_D_1UL.tif",
        "20P1_POS0007_D_1UL.tif"]
for file in files:
    image = cle.imread(folder + file)
    labels = cle.voronoi_otsu_labeling(
                    image, 
                    spot_sigma=3)
    number_of_nuclei = labels.max()
    print(file, number_of_nuclei)
17P1_POS0013_D_1UL.tif 44.0
20P1_POS0005_D_1UL.tif 41.0
20P1_POS0007_D_1UL.tif 73.0

Fonctions au lieu de répétition de code#

Nous pouvons gagner encore plus de flexibilité en introduisant des fonctions dites auxiliaires, qui nous aident en faisant une chose dédiée, par exemple compter les noyaux :

def count_nuclei(image, spot_sigma=3):
    labels = cle.voronoi_otsu_labeling(
                    image, 
                    spot_sigma=spot_sigma)
    number_of_nuclei = labels.max()
    
    return number_of_nuclei
count_nuclei(cle.imread(folder + files[0]))
44.0
count_nuclei(cle.imread(folder + files[1]))
41.0
count_nuclei(cle.imread(folder + files[2]))
73.0
count_nuclei(cle.imread(folder + files[2]), spot_sigma=5)
68.0