有没有办法让doctest的文件路径作为输出,无论它运行的是什么操作系统都会成功?
例如,在Windows上,这将起作用:
r"""
>>> import foo
>>> relative_path = foo.getRelativePath()
>>> print relative_path
'bar\\foobar'
"""
if __name__ == '__main__':
from doctest import testmod
print testmod()
但当然会在Linux上失败并产生类似于:
的错误Failed example:
print relative_path
Expected:
'bar\\foobar'
Got:
'bar/foobar'
如何在任何操作系统上完成上述工作?
修改
我知道我可以做这样的事情:
>>> relative_path == os.path.join('bar', 'foobar')
True
但我想知道是否有不同的更好的方法来做到这一点。
答案 0 :(得分:0)
说明
Doctest的诱人之处在于其简单性,但这是一种误导性的简单性。您希望测试行代表doctest将根据最后一个表达式的结果求值的表达式,但事实并非如此。它实际上只是在进行简单的基本字符串比较。
#doctesttest.py
"""
>>> "test"
"test"
python -m doctest doctesttest.py
给予
...
Expected:
"test"
Got:
'test'
尽管-用Python术语来说-"test" == 'test'
,甚至"test" is 'test'
,str(""" 'test' """)
也与str(""" "test" """)
不匹配。
意识到这一点...
解决方案
以下内容将在所有系统上失败:
def unique_paths(path_list):
""" Returns a list of normalized-unique paths based on path_list
>>> unique_paths(["first/path", ".\\first/path", "second/path"])
['first/path', 'second/path']
"""
return set(os.path.normpath(p) for p in path_list)
我们正在寻找一个简单的字符串匹配项,因此我们需要寻找一个容易匹配的结果 string 。您不必关心分隔符,因此可以删除它或更换它,或者在它周围测试:
def unique_paths(path_list):
""" Returns a list of normalized-unique paths based on path_list
>>> paths = unique_paths(["first/path", ".\\\\first/path", "second/path"])
>>> len(paths)
2
>>> [os.path.split(path) for path in sorted(list(paths))]
[('first', 'path'), ('second', 'path')]
# or heck, even
>>> sorted(list(paths[0])).replace('\\\\', '/')
'first/path'
"""
return set(os.path.normpath(p) for p in path_list)
答案 1 :(得分:-2)
您可以通过调用
来获取与os相关的路径分隔符sep = os.sep
然后处理您正在处理的平台的相对路径。或者你可以使用
os.abspath()
代替。有多种选择(见http://pymotw.com/2/ospath/)。我采用了abspath变种。
-Kim
答案 2 :(得分:-2)
放弃路径名操作函数(os.path.join
,os.path.split
等)。你能说出/
不起作用的情况吗?根据我的经验,这些是很少见的,并且都在调用 cmd.exe 或 command.com 中的Windows本机程序的上下文中(这些程序通常使用{ {1}}选项)。在这个特定场景之外,正向斜线在Windows中的大多数情况下工作,并且我愿意打赌你没有针对VAX / VMS。