为什么我被迫在python中使用os.path.expanduser?

时间:2012-05-07 19:23:04

标签: 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"))
>>>

这真的很烦人,因为毕竟,中的用户名路径可以明确解决...我想编写可以处理用户可能给我的任何输入的代码,但这种行为要求我在我的代码必须处理的每个路径上调用expanduser。这也意味着无论我打印出哪条路径供用户查看,它都会比他们给我的信息略显清晰。

这似乎与“鸭子打字”的概念不一致,其中我概括说我希望python不会对我抱怨,除非实际上有问题...

2 个答案:

答案 0 :(得分:23)

因为底层系统调用无法识别用户路径,并且文件访问API对它们来说是一个相当薄的包装。

此外,非Unix用户,这将是相当令人惊讶的  if(例如)fopen("~foo")返回“foo:no such user”错误(因为"~foo"是一个有效的文件名,例如Windows)...

或者,类似地,如果fopen("~administrator")返回错误,例如“是目录:C:\ Documents and Settings \ Administrator \”。

最后,正如评论者所指出的那样:你将“鸭子打字”与“有用的快捷方式”混为一谈,这是两个完全不同的东西:
- 鸭子打字让我可以用鸭子替代任何像鸭子一样嘎嘎叫的东西 - 有用的快捷方式允许我用鸭子替代任何可以像那样呱呱呱呱呱呱呱呱呱呱呱呱呱呱咕噜咕噜咕噜咕噜咕噜咕噜咕噜咕噜咕噜咕噜咕噜咕噜咕

答案 1 :(得分:6)

在普通的Unix实用程序中,~amosa语法由shell处理,shell是调用实用程序的程序。实用程序本身不知道特殊的~语法(通常)。

因此,如果您的python程序是由Unix上的shell调用的,那么Just Work:

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

注意上面的python程序如何打印扩展路径,即使它显然没有代码来进行扩展本身。 shell扩展了它。