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

amo*_*mos 22 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"))
>>>
Run Code Online (Sandbox Code Playgroud)

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

这似乎与"鸭子打字"的概念不一致,其中我概括为我希望python不要向我抱怨,除非实际上有问题......

Dav*_*ver 23

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

此外,对于非Unix用户来说,
如果(例如)fopen("~foo")返回"foo:no such user"错误("~foo"例如,Windows上的有效文件名),则会非常令人惊讶......
或者,类似地,如果fopen("~administrator")返回像"是目录:C:\ Documents and Settings\Administrator \"之类的错误.

最后,正如评论者所指出的那样:你将"鸭子打字"与"有用的快捷方式"混为一谈,这是两个完全不同的东西:
- 鸭子打字让我可以用鸭子代替鸭子.
- 有用的快捷方式允许我用鸭子替代任何可以像庸医一样嘎嘎叫的东西.(Python并不像其他语言那样"试图让它嘎嘎叫").

  • `~foo`也是linux上的有效名称,以及大多数其他posixy设置. (2认同)
  • 啊,是的 - 这就是区别。Python 不会像其他一些语言那样“尝试让它嘎嘎叫”(例如,Python 会抛出以下错误:`1 + "2"`、`object().foo` 以及引用未定义的变量)。 (2认同)

Dav*_*nes 6

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

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

$ python -c 'import sys; print sys.argv[1]' ~drj
/home/drj
Run Code Online (Sandbox Code Playgroud)

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

  • 这是有用的一点,因为在程序中接受来自命令行的输入时,即使初学者实际上是由shell进行操作,对于初学者来说python也会进行扩展。当以编程方式或从用户输入添加文件名时,这可能会造成混乱,而不会发生这种扩展。 (2认同)