Type hints could help you a lot with a big Python project. However, they sometimes require code refactoring. I wrote about it last year in this article, but I have found a good example for this only now.
Look at this code:
def process(workflow_step): func = step args = step[1:] return func(*args)
What can we get from this piece of code? That
workflow_step is a sequence witch first element is a
Callable object and the other items, if any, are its arguments. Let's assume that
workflow_step is a
Tuple. The problem is that the type
(Tuple) -> Any for this function is utterly uninformative. Can I call process with an empty tuple? Is
(1, 2, 3) OK?
(Tuple[Callable, Any, ...]) -> Any is much better. However, it is not valid. Typing library doesn't allow such syntax. For simple cases, one of the options is to use
Union[Tuple[Callable], Tuple[Callable, Any]] or something similar. In any other cases there is the only one option: rewrite this piece of code.
There are plenty of options how to do it, for example, using
class WorkflowStep(NamedTuple): callable # type: Callable args # type: Tuple def process(workflow_step): # type: (WorkflowStep) -> Any return step.callable(args. args)
Maybe this is not the best piece of code you've ever seen. But no doubts it is much more structured and readable than it was before.
Got a question? Hit me on Twitter: avkorablev