2012-05-07 4 views
18

나는 그것이 의도적 인, 그래서 누군가가이 문제에 대한 이론적 근거를 설명 할 수있는 확신 : 결국, 거기에 사용자 이름과 경로가 명확하게 해결 될 수 있기 때문에파이썬에서 os.path.expanduser를 강제해야하는 이유는 무엇입니까?

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")) 
>>> 

정말 짜증나 ... 사용자가 제공 할 수있는 모든 종류의 입력을 처리 할 수있는 코드를 작성하려고하지만이 문제는 내 코드가 처리해야하는 모든 경로에서 expanduser를 호출해야합니다. 또한 사용자가 볼 수있는 경로를 인쇄하는 곳이면 어느 곳에서나 볼 수있는 것보다 읽기 쉽다는 것을 의미합니다.

이것은 내가 실제로 문제가 아니라면 나에게 우는 소리하지 파이썬 기대하는 의미로 일반화하는 "오리 입력"의 개념과 일치하지 않는 것 같다 ...

+5

잘 모르겠습니다. 파이썬 개발자로서, 명시 적으로 그 동작을 요구하지 않는 한, 파이썬이 나에게 마술처럼 확장 된 문자열을 사용하지 않는다는 사실에 감사드립니다. 코드를 적절히 구현한다면,'expanduser'를 호출하는 것을 집중 시켜서 성가심을 덜어 줄 수 있습니다. – larsks

+4

'chdir'은 리터럴 이름이라고 가정합니다. 그리고 그것은 가장 중요한 것은 오리 타이핑이 의미하는 바가 아닙니다. –

+0

모든 동작을 처리하는 함수를 만듭니다. 파이썬은 핵심 기능을 제공합니다. – Blender

답변

20

기본 시스템 호출하지 않기 때문에 사용자 경로를 인식하고 파일 액세스 API는 파일 경로에 비해 상당히 얇은 래퍼입니다.

는 또한,이 비 유닉스 사용자,
을 위해 매우 놀라운 일이 될 것입니다 경우에 "foo는 : 그런 사용자"를 반환 fopen("~foo") (예를 들어) "~foo"가 유효한 파일 이름 예를 들어,에로 (오류, Windows) ...
fopen("~administrator")이 "디렉토리 : C : \ Documents and Settings \ Administrator \"와 같은 오류를 반환하는 경우 마찬가지로.

마지막으로, 메모 지적대로 : 당신은 완전히 다른 두 가지가 있습니다 "도움 바로 가기"와 "오리 입력"을 혼동하고 있습니다 :
- 오리 입력이 날이 오리처럼 꽥꽥 오리 아무것도를 대체 할 수 있습니다 .
- 유용한 단축키 덕분에 오리처럼 만들 수있는 오리를 대체 할 수 있습니다. (파이썬은 다른 언어처럼 "삐걱 거려하지 않습니다").

+1

'~ foo'는 리눅스와 다른 대부분의 posixy 설정에서도 유효한 이름입니다. – SingleNegationElimination

+0

내 생각에 오리를 타이핑하는 것은 "불평하기 전에"하려고하는 것입니다. 이 경우 Python은 매우 열심히 노력하지 않습니다. Python을 정말 좋아해요. 그냥 작동하는 코드를 작성하기가 쉽기 때문입니다. 그러나 파이썬이 쉘 스크립팅을 할 때, 필자는 많은 유틸리티 코드를 작성하고 있습니다. – amos

+1

아, 그래요. 그래서 그 차이가 있습니다.파이썬은 다른 언어처럼 (예를 들어,'1 + 2 2'','object(). foo'에 대한 에러를 던지고 정의되지 않은 변수를 참조하는 것처럼) "쓰레기통을 만들려고"하지 않습니다. –

5

일반적인 유닉스 유틸리티에서 ~amosa 구문은 유틸리티를 호출하는 프로그램 인 쉘에 의해 처리됩니다. 유틸리티 자체는 특별한 ~ 구문에 대해 알지 못합니다 (일반적으로). 파이썬 프로그램이 유닉스에서 쉘에 의해 호출되는 경우

그래서, 그냥 작동합니다 : 파이썬 프로그램이 위의 확장 경로를 인쇄하는 방법

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

공지 사항, 그것은 명확하게 작업을 수행 할 코드가 없어도 확장 그 자체. 셸이 그것을 확장했습니다.

+1

이것은 유용한 포인트입니다. 명령 행에서 입력을 받아들이는 프로그램에서 실제로 쉘에 의해 수행 되더라도, 파이썬이 확장을 수행하는 초보자에게 나타날 수 있기 때문입니다. 이로 인해 파일 이름을 프로그래밍 방식으로 또는 사용자 입력에서 추가 할 때이 확장이 발생하지 않는 혼란이 발생할 수 있습니다. – zstewart

관련 문제