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