Re: [Python-Dev] Return type of alternative constructors

2016年5月10日 06:24:51 -0700

On 10 May 2016 at 02:30, Guido van Rossum <[email protected]> wrote:
> On Sun, May 8, 2016 at 7:52 PM, Nick Coghlan <[email protected]> wrote:
>> P.S. It occurs to me that a sufficiently sophisticated typechecker
>> might be able to look at all of the calls to "cls(*args, **kwds)" in
>> class methods and "type(self)(*args, **kwds)" in instance methods, and
>> use those to define a set of type constraints for the expected
>> constructor signatures in subclassses, even if the current code base
>> never actually invokes those code paths.
>
> Could you restate that as a concrete code example? (Examples of the problems
> with "construction features" would also be helpful, probably -- abstract
> descriptions of problems often lead me astray.)
Rectangle/Square is a classic example of the constructor signature
changing, so I'll try to use that to illustrate the point with a
"displaced_copy" alternate constructor:
 class Rectangle:
 def __init__(self, top_left_point, width, height):
 self.top_left_point = top_left_point
 self.width = width
 self.height = height
 @classmethod
 def displaced_copy(cls, other_rectangle, offset):
 """Create a new instance from an existing one"""
 return cls(other.top_left_point + offset, other.width, other.height)
 class Square:
 def __init__(self, top_left_point, side_length):
 super().__init__(top_left_point, side_length, side_length)
At this point, a typechecker *could* have enough info to know that
"Square.displaced_copy(some_rectangle, offset)" is necessarily going
to fail, even if nothing in the application actually *calls*
Square.displaced_copy.
Cheers,
Nick.
-- 
Nick Coghlan | [email protected] | Brisbane, Australia
_______________________________________________
Python-Dev mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to