2012-05-07 24 views
18

我敢肯定,這是故意的,所以有人可以解釋的理由爲這種行爲:爲什麼我在python中強制使用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。這也意味着,無論在哪個位置打印出用戶可以看到的路徑,它都會比他們給我的清晰度稍差。

這似乎與「鴨打字」中,我概括的意思,我認爲Python不嗲的,我必須真正有問題的概念不一致......

+5

我不知道。作爲一名Python開發人員,我很欣賞這樣一個事實,即除非我明確要求這種行爲,否則Python不會繞過我的魔法擴展字符串。如果你正確地實現你的代碼,你可能會把你的調用集中到'expanduser',以減少煩惱。 – larsks

+4

'chdir'假定它是一個文字名稱。而這絕對不是鴨子打字的意思。 –

+0

創建一個處理所有行爲的函數。 Python爲您提供核心功能。 – Blender

回答

20

由於基礎系統調用不識別用戶路徑,並且文件訪問API對它們來說是相當薄的包裝。

此外,這將是相當令人驚訝的非Unix用戶
如果(例如)fopen("~foo")返回一個「富:沒有這樣的用戶」的錯誤(如"~foo"是一個有效的文件名上,例如, Windows)...
或者,類似地,如果fopen("~administrator")返回類似「是目錄:C:\ Documents and Settings \ Administrator \」的錯誤。

最後,作爲評論者指出的:你混淆「鴨打字」和「有用的快捷方式」,這是兩個完全不同的事情:
- 鴨打字讓我代替鴨子任何事情叫聲像鴨子。
- 有用的快捷鍵讓我可以替代任何可以製作的東西,像鴨子一樣製作嘎嘎聲(Python並不像其他語言那樣試圖讓它變得嘎嘎)。

+1

'〜foo'也是linux上的一個有效名稱,以及大多數其他posixy設置。 – SingleNegationElimination

+0

我猜想,在抱怨之前,打在我腦海裏的鴨子是「儘量讓它嘎嘎」。在這種情況下,Python並不是很努力。 我真的很喜歡python,因爲它很容易編寫Just Works的代碼。但是當談到讓python執行shell腳本時,我發現自己寫了很多自己的實用程序代碼。 – amos

+1

啊,是的 - 這就是區別。Python不像其他語言那樣「試圖讓它嘎嘎」(例如,Python爲「1 +」2「','object()。foo')引用錯誤,並且引用一個未定義的變量)。 –

5

在普通的Unix實用程序中,~amosa語法由shell調用,該shell是調用實用程序的程序。這些實用程序本身並不知道特殊的~語法(通常)。

所以,如果你的Python程序是通過在Unix外殼調用,都可以正常運行:

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

通知Python程序上面如何打印擴展的路徑,儘管它顯然沒有代碼來執行擴張本身。外殼擴大了它。

+1

這是一個有用的觀點,因爲在接受來自命令行輸入的程序中,初學者可能會覺得python確實會進行擴展,儘管這實際上是由shell完成的。當以編程方式或通過用戶輸入添加文件名時,這可能會導致混淆,而這種擴展不會發生。 – zstewart

相關問題