Diez B. Roggisch wrote: > Neal Becker wrote: > >> Tino Wildenhain wrote: >> >>> Neal Becker wrote: >>> ... >>>>>> So if __str__ is "meant for human eyes", then why isn't print using >>>>>> it! >>>>> it is: >>>>> >>>>> > print x >>>>> str >>>>> >>>>> but dict just uses repr() for all its childs to print. >>>>> >>>>> T. >>>> That makes no sense to me. If I call 'print' on a container, why >>>> wouldn't it recursively print on the contained objects? Since print >>>> means call str, printing a container should recursively call str on the >>>> objects. >>> >>> Every class is free on how to best implement __str__, you will find >>> the same behavior on tuple and list as well. >>> >>> Maybe its discussable to change the implementation sensibly, best if you >>> would come with a proposal? Perhaps pprint.pprint is a starting point? >>> >>> Regards >>> Tino >> >> First, I'd like to know if there is a rationale for the current design. >> Am I correct in thinking this is a defect? > > I don't think so. First of all, there is no "generic" way of printing a > collection. And the current implementation tries to give an overview what > is contained in the collection, without trying to make it "fancy" - any > such thing needed to be hand-coded anyway. > > Using repr for that is better suited, as for example string keys are > printed with quotes around them - making clear what they are, and not > irritating the user through potentially contained spaces or even things > that look as if they are python objects. > > For example, if repr *wasn't* used, > > { "{foo=bar}" : "baz"} > > would be printed > > {{foo=bar} : baz} > > Which is *not* what the dictionary actually contains! > > The same goes for unicode-objects. They appear with their "funny" > characters as \xXX-codes - instead of bailing out on you with > unicode-errors. > > So, IMHO the current behavior is desired. >
So if I want to overload something in my custom class, so that I get a nice string whether it's printed directly, or as part of a container, what is the recommendation? Overload both __str__ and __repr__? -- http://mail.python.org/mailman/listinfo/python-list