Re: string methods of a str subclass

2007-04-16 Thread 7stud
On Apr 16, 3:28 am, Daniel Nogradi [EMAIL PROTECTED] wrote:
 I am probably misunderstanding some basic issue here but this
 behaviour is not what I would expect:

 Python 2.4 (#1, Mar 22 2005, 21:42:42)
 [GCC 3.3.5 20050117 (prerelease) (SUSE Linux)] on linux2
 Type help, copyright, credits or license for more information. 
 class mystr( str ):

 ... pass
 ...

  x = mystr( 'x' )
  isinstance( x, mystr )
 True
  isinstance( x.strip( ), mystr )
 False

 Why is the strip( ) method returning something that is not a mystr
 instance? I would expect all methods operating on a string instance
 and returning another string instance to correctly operate on a mystr
 instance and return a mystr instance. How would I achieve something
 like this without manually copying all string returning methods from
 str and stuffing the result to mystr( ) before returning?

class A(object):
def __init__(self, s):
self.s = s
def strip(self):
return 2

class mystr(A):
pass

x = mystr(x)
print isinstance(x, mystr)
print isinstance(x.strip(), mystr)


-- 
http://mail.python.org/mailman/listinfo/python-list


Re: string methods of a str subclass

2007-04-16 Thread Duncan Booth
Daniel Nogradi [EMAIL PROTECTED] wrote:

 Why is the strip( ) method returning something that is not a mystr
 instance? I would expect all methods operating on a string instance
 and returning another string instance to correctly operate on a mystr
 instance and return a mystr instance.

Why would you expect that?
Would you expect the __str__ and__repr__ methods also to return a mystr 
instance? If not those, then which other ones might also be excluded?
Is x.encode('zip') still a mystr instance or an encoded byte-string?

 How would I achieve something
 like this without manually copying all string returning methods from
 str and stuffing the result to mystr( ) before returning?

You don't without wrapping all the affected methods. It doesn't need to 
involve manual copying though: you have a programming language available so 
just write a list of method names and then some code to wrap them 
automatically.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: string methods of a str subclass

2007-04-16 Thread 7stud
On Apr 16, 3:28 am, Daniel Nogradi [EMAIL PROTECTED] wrote:
 I would expect all methods operating on a string instance
 and returning another string instance

Ok, then this:

class A(object):
def __init__(self, s):
self.s = s
def strip(self):
return self.s

class mystr(A):
pass

x = mystr(x)
print isinstance(x, mystr)
print isinstance(x.strip(), mystr)


x is a string, and that is what gets passed to the base class's
__init__ method, and that is what strip() operates on.


-- 
http://mail.python.org/mailman/listinfo/python-list


Re: string methods of a str subclass

2007-04-16 Thread Daniel Nogradi
  Why is the strip( ) method returning something that is not a mystr
  instance? I would expect all methods operating on a string instance
  and returning another string instance to correctly operate on a mystr
  instance and return a mystr instance.

 Why would you expect that?
 Would you expect the __str__ and__repr__ methods also to return a mystr
 instance? If not those, then which other ones might also be excluded?
 Is x.encode('zip') still a mystr instance or an encoded byte-string?

Okay, good point, thanks.

  How would I achieve something
  like this without manually copying all string returning methods from
  str and stuffing the result to mystr( ) before returning?

 You don't without wrapping all the affected methods. It doesn't need to
 involve manual copying though: you have a programming language available so
 just write a list of method names and then some code to wrap them
 automatically.

Yes, this is in fact what I am doing, using __getattr__ and such. Thanks again.
-- 
http://mail.python.org/mailman/listinfo/python-list