2012-05-07 6 views
18

Sono sicuro che è intenzionale, in modo che qualcuno può spiegare le ragioni di questo comportamento:Perché sono obbligato a os.path.expanduser in python?

Python 2.7.2 (default, Oct 13 2011, 15:27:47) 
[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from os.path import isdir,expanduser 
>>> isdir("~amosa/pdb") 
False 
>>> isdir(expanduser("~amosa/pdb")) 
True 
>>> 
>>> from os import chdir 
>>> chdir("~amosa/pdb") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
OSError: [Errno 2] No such file or directory: '~amosa/pdb' 
>>> chdir(expanduser("~amosa/pdb")) 
>>> 

E 'davvero fastidioso perché, dopo tutto, il percorso con un nome utente in esso può essere risolto in modo inequivocabile ... Voglio scrivere un codice che possa gestire qualsiasi tipo di input che un utente potrebbe darmi, ma questo comportamento mi obbliga a chiamare expanduser su ogni percorso che il mio codice deve gestire. Significa anche che ovunque io stampi quel percorso che l'utente deve vedere, sarà leggermente meno leggibile di quello che mi hanno dato.

Questo sembra in contrasto con il concetto di "duck typing", in cui generalizzo nel senso che mi aspetto Python non a piagnucolare per me, se non c'è in realtà un problema ...

+5

Non so. Come sviluppatore Python, apprezzo il fatto che Python non aggiri magicamente le stringhe su di me a meno che non richiedi esplicitamente tale comportamento. Se implementi il ​​tuo codice correttamente, puoi probabilmente centralizzare le tue chiamate a 'expanduser' per renderlo meno fastidioso. – larsks

+4

'chdir' assume che sia un nome letterale. E questo non è assolutamente ciò che significa digitazione anatra. –

+0

Crea una funzione che gestisca tutto il comportamento. Python ti offre le funzionalità principali. – Blender

risposta

20

Perché le chiamate di sistema sottostanti non lo fanno riconoscere i percorsi utente e le API di accesso ai file sono un involucro abbastanza sottile su di essi.

Inoltre, sarebbe abbastanza sorprendente per gli utenti non-Unix,
se (ad esempio) fopen("~foo") restituisce un "pippo: tale utente" errore (come "~foo" è un nome di file valido, ad esempio, Windows) ...
Oppure, analogamente, se fopen("~administrator") restituisce un errore del tipo "È una directory: C: \ Documents and Settings \ Administrator \".

Infine, come commentatori hanno notato: stai confondendo "duck typing" con "scorciatoie utile", che sono due cose completamente diverse:
- duck typing mi permette di sostituire un qualcosa di anatra che starnazza come un'anatra .
- Le scorciatoie utili mi consentono di sostituire una papera che può essere sostituita da in come un papero (Python non "tenta di farlo diventare ciarlatano" come fanno alcuni altri linguaggi).

+1

'~ foo' è anche un nome valido su linux e sulla maggior parte delle altre impostazioni dei posix. – SingleNegationElimination

+0

Immagino che digrignare nella mia mente sia "provare a farlo ciarlare" prima di lamentarsi. In questo caso, Python non sta provando molto duramente. Mi piace molto Python perché è facile scrivere codice che funziona solo. Ma quando si tratta di fare in modo che python esegua lo scripting di shell, trovo che sto scrivendo molto del mio codice di utilità. – amos

+1

Ah, sì - quindi questa è la differenza.Python non "tenta di farlo ciarlare" come fanno altri linguaggi (per esempio, Python lancia errori per: '1 +" 2 "', 'object(). Foo', e fa riferimento a una variabile non definita). –

5

Nelle normali utility Unix, la sintassi ~amosa viene gestita dalla shell, che è il programma che richiama le utilità. Le utilità stesse non conoscono la sintassi speciale ~ (generalmente).

Così, se il programma Python viene richiamato da un guscio su Unix, esso continuerà a funzionare:

$ python -c 'import sys; print sys.argv[1]' ~drj 
/home/drj 

Notate come il programma python sopra stampa il percorso ampliato, anche se non ha chiaramente alcun codice per fare il espansione stessa. La shell l'ha espanso.

+1

Questo è un punto utile, dal momento che nei programmi che accettano input dalla riga di comando, può sembrare ai principianti che Python faccia espansione, anche se questo viene effettivamente fatto dalla shell. Ciò può creare confusione quando si aggiunge un nome file in modo programmatico o da un input dell'utente, dove questa espansione non avviene. – zstewart

Problemi correlati