(original) (raw)

On 5 April 2013 02:16, Ethan Furman <ethan@stoneleaf.us> wrote:
On 04/04/2013 08:01 AM, Chris Angelico wrote:
On Fri, Apr 5, 2013 at 1:59 AM, Guido van Rossum <guido@python.org> wrote:
On Thu, Apr 4, 2013 at 7:47 AM, Chris Angelico <rosuav@gmail.com> wrote:
Is there any argument that I can pass to Foo() to get back a Bar()?
Would anyone expect there to be one? Sure, I could override \_\_new\_\_ to
do stupid things, but in terms of logical expectations, I'd expect
that Foo(x) will return a Foo object, not a Bar object. Why should int
be any different? What have I missed here?


A class can define a \_\_new\_\_ method that returns a different object. E.g.
(python 3):

Right, I'm aware it's possible. But who would expect it of a class?

FTR I'm in the int() should return an int camp, but to answer your question: my dbf module has a Table class, but it returns either a Db3Table, FpTable, VfpTable, or ClpTable depending on arguments (if creating a new one) or the type of the table in the existing dbf file.

I fall into:

1\. int(), float(), str() etc should return that exact class (and operator.index() should return exactly an int).

2\. It could sometimes be useful for \_\_int\_\_() and \_\_index\_\_() to return a subclass of int.

So, for the int constructor, I would have the following logic (assume appropriate try/catch):

def \_\_new\_\_(cls, obj):
i = obj.\_\_int\_\_()

if type(i) is int:
return i

return i.\_internal\_value

Tim Delaney