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

2024-05-14 12:28:27 发布

您现在位置: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。这也意味着,无论我在哪里打印出供用户查看的路径,它都会比他们给我的稍不清晰。

这似乎与“duck-typing”的概念不一致,在“duck-typing”中,我将其概括为我希望python不会对我发牢骚,除非真的有问题。。。


Tags: or代码用户fromimport路径typingos
2条回答

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

因此,如果您的python程序是由Unix上的shell调用的,那么它只会工作:

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

请注意上面的python程序是如何打印扩展路径的,尽管它显然没有代码来执行扩展本身。炮弹把它炸开了。

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

此外,对于非Unix用户来说,
如果(例如)fopen("~foo")返回“foo:no such user”错误(例如,"~foo"是Windows上的有效文件名)…
或者,类似地,如果fopen("~administrator")返回一个类似于“Is a directory:C:\ Documents and Settings\Administrator\”的错误。

最后,正如评论人士指出的那样:你把“duck typing”和“helping shortcuts”混为一谈,这是两件完全不同的事情:
-鸭子打字让我可以代替鸭子任何像鸭子一样呱呱叫的东西。
-有用的快捷方式允许我替换duck任何可以像鸭子一样呱呱叫的东西(Python不像其他语言那样“试图让它呱呱叫”)。

相关问题 更多 >

    热门问题