'Optional' is key there. Don't want to use type checking? You don't have to.
It's a bit like how some video games introduce one skill or gameplay mechanic at a time, which helps keep players from being overwhelmed by new concepts.
So before deciding you can’t use it, see if there’s a way to make it header-only.
...because the skills of programmers and other employees hired for this were inadequate. That's it.
It's true for everything. It is possible - and it was demonstrated many, many times - that you can develop huge code bases and successful projects in basically every language in existence, including Asm, PERL, PHP, JavaScript, C, Visual Basic, Cobol, Lisp, Fortran, Prolog and so on. Obviously also including Python.
So if your project, in Python, breaks down above some number of LOC, it's, unfortunately, yours, and only yours, responsibility. Your architecture and/or programming skills were simply not up to the task.
Is it easier to write huge projects in some languages than in other? Yes, of course. Is that difference big enough to justify the claim that it didn't work "simply because Python"? No, not at all.
> Python’s lack of safety guarantees can be problematic when, as is increasingly the case, it is used for critical applications with high correctness demands. The Python community has reacted to this trend by integrating type annotations and optional static type checking into the language [20]. However, there is currently virtually no tool support for reasoning about Python programs beyond type safety.
> for critical applications with high correctness demands If you have that use case, pick an appropriate tool. There's more than one programming language ya know?
For high correctness & high performance I think Rust is a great choice, although some of the libraries aren't there yet in terms of maturity. So I usually only use Rust for programs with a small scope where I know that everything I need is available. Or make a DLL with a C interface that I can then call from F#.
a) pick an appropriate tool and rewrite their code.
b) pick an appropriate tool (python type annotations, this verifier), use it to make the python code robust, and deploy the python code in production?
Even if doing a) is as easy as doing b) and produces faster, more efficient code, doing a) again will be more expensive than doing b) again when the data scientists update their python code (even if the typed python and the untyped python are in separate repositories, but ideally, the data scientists would continue working with the ‘solidified’ code, adding duct-typed code at will)
There are other implementations and Python supersets that do use type annotations for optimization and I don't see this trend slowing.
As a result, in CPython 3.6 a module that has been type hinted will import slower than one that doesn't.
Such as Cython.