string methods of a str subclass

D

Daniel Nogradi

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..... pass
....

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?
 
7

7stud

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
...
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)
 
D

Duncan Booth

Daniel Nogradi said:
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.
 
7

7stud

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.
 
D

Daniel Nogradi

Why is the strip( ) method returning something that is not a mystr
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.
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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,968
Messages
2,570,150
Members
46,697
Latest member
AugustNabo

Latest Threads

Top