[Python-ideas] Changing str(someclass) to return only the class name

Steven D'Aprano steve at pearwood.info
Sat Oct 22 09:32:25 CEST 2011


Nick Coghlan wrote:
> On Sat, Oct 22, 2011 at 3:45 AM, Steven D'Aprano <steve at pearwood.info> wrote:
>> Éric Araujo wrote:
>>> Hi everyone,
>>>
>>> I’ve sometimes wished that str(someclass) were the natural way to get a
>>> class name, for example when writing __repr__ methods.
>> someclass.__name__ seems much more natural to me.
>>
>> If you want the name of the class, ask for its name, not its string
>> representation. Generally speaking, the string representation should tell
>> you what sort of object it is (either explicitly or implicitly), not just
>> its value.
> 
> While that's an accurate description of the purpose of a "string
> representation", the function that serves that purpose is repr(), not
> str(). Éric's patch doesn't touch type.__repr__, only type.__str__.
> 
> str() is different - it's the one which is designed for general human
> consumption, and may omit some details if it makes sense.

Yes, I understand the difference between repr and str and the guidelines 
for them both. My argument is that for human consumption, str(MyClass) 
should continue to return something like "<class MyClass>" and not just 
"MyClass".


> The use case that lead to the patch was actually string interpolation
> rather than direct invocation of str(). There's a lot of object
> representation code and error message formatting code that currently
> uses "obj.__class__.__name__" or "type(obj).__name__" to plug into a
> "{}" or "%s" placeholder in a format string.

Regardless of where or how you are using the name, if you explicitly 
want the name, you should ask for it explicitly rather than implicitly.

Remember also that print(spam) will use str(spam). If you do this:

 >>> print(spam)
something


what would you expect spam is? My bet is that you expect it to be the 
string "something". With your suggestion, it could be either the string 
"something", a function named something, a module named something, or a 
class named "something" (if one uses __name__ rather than module.class 
name). I don't consider this helpful.

I am aware that the string representation (using either __str__ or 
__repr__) of an object is not the definitive word in what the object 
really is. Using just print, one can't distinguish between a class and a 
string "<class '__main__.Spam'>", or for that matter between the string 
2 and the int 2, and that arbitrary objects can return arbitrary 
strings. Nevertheless, I like the __str__ of classes, modules and 
functions just the way they are.



-- 
Steven




More information about the Python-ideas mailing list