2012-05-07 14 views
18

Jestem pewien, że to zamierzone, więc może ktoś wyjaśnić uzasadnienie dla takiego zachowania:Dlaczego jestem zmuszony do os.path.expanduser w 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")) 
>>> 

To naprawdę irytujące, ponieważ, mimo wszystko, ścieżka z nazwą użytkownika w nim mogą być rozwiązane w sposób jednoznaczny ... Chcę napisać kod, który poradzi sobie z każdym rodzajem danych wprowadzanych przez użytkownika, ale to zachowanie wymaga ode mnie wywoływania programu expanduser na każdej ścieżce, z którą ma do czynienia mój kod. Oznacza to również, że wszędzie, gdzie wydrukuję tę ścieżkę, aby użytkownik mógł ją zobaczyć, będzie to nieco mniej czytelne niż to, co mi dali.

Wydaje sprzeczne z koncepcją „kaczka wpisując”, w którym uogólnienia oznaczać, że nie spodziewam Pythonie jęcz mi chyba, że ​​faktycznie problem ...

+5

Nie wiem. Jako programista w Pythonie doceniam fakt, że Python nie ingeruje w moje magiczne rozszerzenia, chyba że wyraźnie zażądam takiego zachowania. Jeśli poprawnie zaimplementujesz swój kod, prawdopodobnie możesz scentralizować swoje połączenia z 'expanduser', aby zmniejszyć jego uciążliwość. – larsks

+4

'chdir' zakłada, że ​​jest to dosłowne imię. A to zdecydowanie nie znaczy, co oznacza pisanie kaczek. –

+0

Utwórz funkcję, która obsługuje wszystkie zachowania. Python zapewnia podstawową funkcjonalność. – Blender

Odpowiedz

20

Ponieważ podstawowe wywołania systemowe nie rozpoznaje ścieżki użytkownika, a interfejsy API dostępu do plików są dość cienkim opakowaniem.

Dodatkowo, byłoby to dość zaskakujące dla użytkowników nieuniksowych,
if (na przykład) fopen("~foo") zwraca „foo: Nie ma takiego użytkownika” błąd (jak "~foo" jest poprawną nazwą pliku, na przykład, Windows) ...
Lub, podobnie, jeśli fopen("~administrator") zwraca błąd podobny do "Jest katalog: C: \ Dokumenty i ustawienia \ Administrator \".

Wreszcie, jak komentujących zauważyli: jesteś mylące „kaczka wpisując” z „pomocnych skrótów”, które są dwie zupełnie różne rzeczy:
- Duck wpisywanie pozwala mi na niczym zastąpić kaczki które znachorów jak kaczka .
- Przydatne skróty pozwalają mi zastąpić wszystko, co kaczka, która może być wykonana na kaczkę w stylu (Python nie "próbuje sprawić, by stał się znachorem", jak robią to inne języki).

+1

'~ foo' to również poprawna nazwa na Linux i większość innych ustawień posixy. – SingleNegationElimination

+0

Domyślam się, że pisanie na maszynie do pisania w mojej głowie to "spróbuj zrobić z niej znachora", zanim zaczniesz narzekać. W tym przypadku Python nie bardzo się stara. Naprawdę lubię Pythona, ponieważ łatwo jest napisać kod, który działa poprawnie. Ale jeśli chodzi o uzyskanie Pythona do wykonywania skryptów powłoki, uważam, że piszę dużo mojego własnego kodu narzędziowego. – amos

+1

Ah, tak - więc to różnica.Python nie "próbuje zrobić z tego powodu", tak jak robią to inne języki (na przykład Python zgłasza błędy dla: '1 +" 2 "', 'object(). Foo' i odwoływania się do niezdefiniowanej zmiennej). –

5

W normalnych programach uniksowych, składnia ~amosa jest obsługiwana przez powłokę, która jest programem wywołującym narzędzia. Same narzędzia nie wiedzą o specjalnej składni ~ (ogólnie).

Więc jeśli twój program python jest wywoływana przez powłoki na Unix, to będzie po prostu pracować:

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

zauważyć, jak program python powyżej drukuje rozszerzoną ścieżkę, mimo że wyraźnie nie ma kodu zrobić to sama ekspansja. Powłoka rozszerzyła go.

+1

Jest to przydatny punkt, ponieważ w programach akceptujących dane wejściowe z wiersza poleceń może się wydawać, że dla początkujących python robi ekspansję, mimo że jest to faktycznie wykonywane przez powłokę. Może to prowadzić do zamieszania podczas dodawania nazwy pliku programowo lub z danych wprowadzonych przez użytkownika, gdzie to rozszerzenie się nie dzieje. – zstewart

Powiązane problemy