os.path.vnormpath

Peter Otten __peter__ at web.de
Sun Nov 9 04:53:32 EST 2003


Ben Allfree wrote:

> Written to normalize web server path names based on a virtual root. I
> propose that something equivalent to this be added to os.path

The purpose remains unclear to me. Maybe you could expand a little.
For now, I suppose you intend vnormpath() to always return subfolders of
root.

> -------------------------------------
> import os.path
> import copy
> 
> def vnormpath(root,path):
>     """
>     Normalize a path based on a virtual root.
>     """
>     r = copy.deepcopy(root)
>     p = copy.deepcopy(path)

Strings are "immutable", i. e. you can't change them once created. You
therefore need not (I'd rather say must not) copy them.

> 
>     if os.path.isabs(path):
>         return root + path

This can give you funny paths on Windows like "C:/firstC:/second"; on Unix
you can get anywhere the supplier of *path* wants,
e. g. vnormpath("/home/peter", "/../ben") returns "/home/peter/../ben" which
is equivalent to "home/ben".

>     while os.path.commonprefix([root,
>     os.path.normpath(os.path.join(r,p))])
> <> root:
>         r = os.path.join(r,"junk")
>     return os.path.normpath(os.path.join(r,p))

I tried to break that, too, but must admit I didn't succed so far :-)
By the way, most pythonistas favour != over <>.

> if __name__ == "__main__":
>     print vnormpath("C:\\foo\\baz",
> "..\\..\\..\\..\\foo\\baz\\..\\..\\..\\frob\\glop")

The above demo is probably a good start, but try to think of a few more
use/test cases. For example, should
vnormpath("/home/ben", "/home/ben/temp") return "/home/ben/home/ben/temp" or
rather "home/ben/temp"? Also, I would compare vnormpath()'s actual against
the expected result instead of just printing it out. For production quality
code, have a look at the unittest module.

Conclusion: For the moment, be satisfied if you can fix the bugs and your
function serves *your* needs well. If you want to share the results, put it
on a web site.
For your code to make it into the python library, you have to convince
people that *they* need it badly and I dare say that you may face some
strong opposition.

Peter






More information about the Python-list mailing list