Problems trying to override __str__ on path class

Mike Krell no at spam.com
Sun Oct 22 14:14:41 EDT 2006


I'm running into problems trying to override __str__ on the path class 
from Jason Orendorff's path module 
(http://www.jorendorff.com/articles/python/path/src/path.py).

My first attempt to do this was as follows:

'''
class NormPath(path):
    def __str__(self):
        return 'overridden __str__: ' + path.__str__(self.normpath())
'''

The problem is that the override is not invoked unless str() is called 
explictly, as indicated by the test program and its output below:

'''
from normpath import NormPath
np = NormPath('c:/mbk/test')
print 'np: "%s"' % np
print 'str(np): "%s"' % str(np)
print np / 'appendtest'


np: "c:/mbk/test"
str(np): "overridden __str__: c:\mbk\test"
c:/mbk/test\appendtest
'''

I suspect that the problem has to do with the base class of the path 
class being unicode because it works when I create dummy classes derived 
off of object.

My next attempt was to try delegation as follows:

'''
class NormPath(object):
    def __init__(self, *a, **k):
        self._path = path(*a, **k)

    def __str__(self):
        return 'overridden __str__: ' + str(self._path.normpath())

    def __getattr__(self, attr):
        print 'delegating %s...' % attr
        return getattr(self._path, attr)
'''

In this case the test program blows up with a TypeError when trying to 
invoke the / operator:

'''
np: "overridden __str__: c:\mbk\test"
str(np): "overridden __str__: c:\mbk\test"
-------------------------------------------------------------------------
exceptions.TypeError                                 Traceback (most 
recent call last)

e:\projects\Python\vc\nptest.py
      1 from normpath import NormPath
      2 np=NormPath('c:/mbk/test')
      3 print 'np: "%s"' % np
      4 print 'str(np): "%s"' % str(np)
----> 5 print np / 'appendtest'

TypeError: unsupported operand type(s) for /: 'NormPath' and 'str'
WARNING: Failure executing file: <nptest.py>
'''

Can someone explain these failures to me?  Also, assuming I don't want to 
modify path.py itself, is there any way to do what I'm trying to 
accomplish?  BTW, I'm running 2.4.2 under Windows.

Thanks in advance,
   Mike



More information about the Python-list mailing list