how to get os.py to use an ./ntpath.py instead of Lib/ntpath.py

Thomas Rachel nutznetz-0c1b6768-bfa9-48d5-a470-7603bd3aa915 at spamschutz.glglgl.de
Wed Sep 12 02:17:11 EDT 2012


Am 11.09.2012 05:46 schrieb Steven D'Aprano:

> Good for you. (Sorry, that comes across as more condescending than it is
> intended as.) Monkey-patching often gets used for quick scripts and tiny
> pieces of code because it works.
>
> Just beware that if you extend that technique to larger bodies of code,
> say when using a large framework, or multiple libraries, your experience
> may not be quite so good. Especially if *they* are monkey-patching too,
> as some very large frameworks sometimes do. (Or so I am lead to believe.)

This sonds like a good use case for a context manager, like the one in 
decimal.Context.get_manager().

First shot:

@contextlib.contextmanager
def changed_os_path(**k):
     old = {}
     try:
         for i in k.items():
             old[i] = getattr(os.path, i)
             setattr(os.path, i, k[i])
         yield None
     finally:
         for i in k.items():
             setattr(os.path, i, old[i])

and so for your code you can use

     print 'os.walk(\'goo\') with modified isdir()'
     with changed_os_path(isdir=my_isdir):
         for root, dirs, files in os.walk('goo'):
             print root, dirs, files

so the change is only effective as long as you are in the relevant code 
part and is reverted as soon as you leave it.


Thomas



More information about the Python-list mailing list