
Lavorare con i filesystem è uno dei compiti più banali nella programmazione. Sorprendentemente, molti di noi continuano a sbagliare poiché tendiamo a rappresentare i percorsi dei file come stringhe. Questo è fondamentalmente sbagliato ed è uno degli anti-pattern più comuni che sicuramente avrai già visto in molti repository Python diversi.
Nell’articolo di oggi discuteremo del motivo per cui è una cattiva idea utilizzare le stringhe (o anche i file os
module) per rappresentare percorsi sui filesystem. Inoltre, discuteremo delle migliori pratiche e vedremo in azione come utilizzarle pathlib
pacchetto per codificare correttamente i percorsi dei file in Python. Iniziamo!
Perché usare le stringhe per rappresentare i percorsi è una cattiva idea
Diversi sistemi operativi utilizzano convenzioni di denominazione diverse quando si tratta di rappresentare i percorsi sui propri file system. Ad esempio, Unix utilizza una barra /
come separatore di directory mentre Windows utilizza le barre rovesciate \
# Unix (e.g. Linux, OSX, etc.)
/home/this/is/a/path/to/a/directory# Windows
C:\home\this\is\a\path\to\a\directory
Portabilità del codice si riferisce a un insieme di principi che consentono al codice sorgente di essere eseguito su più ambienti diversi con lo stesso comportamento. Pertanto, la rappresentazione del percorso con stringhe non lo renderebbe possibile, a meno che non gestiamo i percorsi in modo diverso, in base al sistema operativo eseguito dal codice sorgente.
Ma anche in questo caso, renderemmo il nostro codice disordinato e inutilmente complesso.
# This is a bad practice
import platformif platform.system() == 'Windows':
filepath = 'C:\home\this\is\a\path\to\a\directory'
else: # e.g. 'Darwin' for OSX or 'Linux'
filepath = '/home/this/is/a/path/to/a/directory'
Anche ulteriori operazioni sulle stringhe che rappresentano i percorsi diventeranno più complesse. Supponiamo che desideri concatenare due percorsi: la semplice concatenazione di stringhe potrebbe risultare in un percorso non valido, soprattutto se una o più stringhe contengono caratteri speciali come barre avanti o indietro.
path_1 = '/this/is/a/path/'
path_2 = '/another/path'# filepath = '/this/is/a/path//another/path'
filepath = path_1 + path_2
Fonte: towardsdatascience.com