Rappresentazione del percorso in Python

'Path representation in Python'.

Ecco perché dovresti evitare di rappresentare i percorsi come stringhe e usare invece Pathlib

Foto di Matt Duncan su Unsplash

Lavorare con i filesystem è uno dei compiti più banali nella programmazione. Sorprendentemente, molti di noi sbagliano ancora perché tendiamo a rappresentare i percorsi dei file come stringhe. Questo è fondamentalmente sbagliato ed è uno dei pattern anti-pattern più comuni che sicuramente avrai già visto in molti diversi repository Python.

Nell’articolo di oggi discuteremo perché è una cattiva idea utilizzare stringhe (o addirittura il modulo os) per rappresentare i percorsi sui filesystem. Inoltre, discuteremo le best practice e vedremo in azione come utilizzare il pacchetto pathlib per codificare correttamente i percorsi dei file in Python. Iniziamo!

Perché utilizzare stringhe per rappresentare i percorsi è una cattiva idea

I diversi sistemi operativi utilizzano diverse convenzioni di denominazione quando si tratta di rappresentare i percorsi sui loro filesystem. Ad esempio, Unix utilizza una barra obliqua / come separatore di directory mentre Windows utilizza il backslash \

# Unix (ad esempio Linux, OSX, ecc.)/home/this/is/a/path/to/a/directory# WindowsC:\home\this\is\a\path\to\a\directory

La portabilità del codice si riferisce a un insieme di principi che consentono al codice sorgente di essere eseguito su diversi ambienti con lo stesso comportamento. Pertanto, la rappresentazione dei percorsi con le stringhe non renderebbe possibile ciò, a meno che non gestiamo i percorsi in modo diverso, in base al sistema operativo in cui viene eseguito il codice sorgente.

Ma anche in quel caso, renderemmo il nostro codice confuso e inutilmente complesso.

# Questa è una cattiva praticaimport platformif platform.system() == 'Windows':  filepath = 'C:\home\this\is\a\path\to\a\directory'else:  # ad es. 'Darwin' per OSX o 'Linux'  filepath = '/home/this/is/a/path/to/a/directory'

Ulteriori operazioni sulle stringhe che rappresentano i percorsi diventeranno anche più complesse. Supponiamo che tu voglia concatenare due percorsi: la semplice concatenazione di stringhe potrebbe risultare in un percorso non valido, specialmente se una o più stringhe contengono caratteri speciali come barre oblique o inverse.

path_1 = '/this/is/a/path/'path_2 = '/another/path'# filepath = '/this/is/a/path//another/path'filepath = path_1 + path_2