如何编写与OS路径分隔符无关的Python doctest

时间:2014-08-12 07:27:17

标签: python-2.6 doctest

有没有办法让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

但我想知道是否有不同的更好的方法来做到这一点。

3 个答案:

答案 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)
  1. 我们得到了一套,而不是一份清单,
  2. 将集合转换为列表需要提供一致的顺序,
  3. doctest使用 eval ,因此“。\ first”中的“ \”将转换为“ \”。

我们正在寻找一个简单的字符串匹配项,因此我们需要寻找一个容易匹配的结果 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.joinos.path.split等)。你能说出/不起作用的情况吗?根据我的经验,这些是很少见的,并且都在调用 cmd.exe command.com 中的Windows本机程序的上下文中(这些程序通常使用{ {1}}选项)。在这个特定场景之外,正向斜线在Windows中的大多数情况下工作,并且我愿意打赌你没有针对VAX / VMS。