Newbie: static typing?

Rotwang sg552 at hotmail.co.uk
Tue Aug 6 10:25:26 EDT 2013


On 06/08/2013 11:07, Rui Maciel wrote:
> Joshua Landau wrote:
>
>> Unless you have a very good reason, don't do this [i.e. checking
>> arguments for type at runtime and raising TypeError]. It's a damn pain
>> when functions won't accept my custom types with equivalent
>> functionality -- Python's a duck-typed language and it should behave
>> like one.
>
> In that case what's the pythonic way to deal with standard cases like this
> one?
>
> <code>
> class SomeModel(object):
>          def __init__(self):
>                  self.label = "this is a label attribute"
>
>          def accept(self, visitor):
>                  visitor.visit(self)
>                  print("visited: ", self.label)
>
>
> class AbstractVisitor(object):
>          def visit(self, element):
>                  pass
>
>
> class ConcreteVisitorA(AbstractVisitor):
>          def visit(self, element):
>                  element.label = "ConcreteVisitorA operated on this model"
>
> class ConcreteVisitorB(AbstractVisitor):
>          def visit(self, element):
>                  element.label = "ConcreteVisitorB operated on this model"
>
>
> model = SomeModel()
>
> operatorA = ConcreteVisitorA()
>
> model.accept(operatorA)
>
> operatorB = ConcreteVisitorB()
>
> model.accept(operatorA)
>
> not_a_valid_type = "foo"
>
> model.accept(not_a_valid_type)
> </python>

The Pythonic way to deal with it is exactly how you deal with it above. 
When the script attempts to call model.accept(not_a_valid_type) an 
exception is raised, and the exception's traceback will tell you exactly 
what the problem was (namely that not_a_valid_type does not have a 
method called "visit"). In what way would runtime type-checking be any 
better than this? There's an obvious way in which it would be worse, 
namely that it would prevent the user from passing a custom object to 
SomeModel.accept() that has a visit() method but is not one of the types 
for which you thought to check.




More information about the Python-list mailing list