Well, I'm not much of a python programmer, but I'd say that the answer is 'YES'.
Any dynamic language that lets you create a variable with any name at any time, could use a 'strict' pragma.
Strict vars (one of the options for strict in Perl, 'use strict' turns them all on at once) in Perl requires that all variables are declared before they are used. Which means that this code:
my $strict_is_good = 'foo';
$strict_iS_good .= 'COMPILE TIME FATAL ERROR';
Generates a fatal error at compile time.
I don't know of a way to get Python to reject this code at compile time:
strict_is_good = 'foo';
strict_iS_good += 'RUN TIME FATAL ERROR';
You will get a run-time exception that strict_iS_good
is undefined. But only when the code is executed. If your test suite does not have 100% coverage, you can easily ship this bug.
Any time I work in a language that does not have this behavior (PHP for example), I get nervous. I am not a perfect typist. A simple, but hard to spot, typo can cause your code to fail in ways that may be hard to track down.
So, to reiterate, YES Python could use a 'strict' pragma to turn on compile time checks for things that can be checked at compile time. I can't think of any other checks to add, but a better Python programmer probably could think of some.
Note I focus on the pragmatic effect of stict vars in Perl, and am glossing over some of the details. If you really want to know all the details see the perldoc for strict.
Update: Responses to some comments
Jason Baker : Static checkers like pylint are useful. But they represent an extra step that can be and often is skipped. Building some basic checks into the compiler guarantees that these checks are performed consistently. If these checks are controllable by a pragma, even the objection relating to the cost of the checks becomes moot.
popcnt : I know that python will generate a run time exception. I said as much. I advocate compile time checking where possible. Please reread the post.
mpeters : No computer analysis of code can find all errors--this amounts to solving the halting problem. Worse, to find typos in assignments, your compiler would need to know your intentions and find places where your intentions differ from your code. This is pretty clearly impossible.
However this does not mean that no checking should be done. If there are classes of problems that are easy to detect, then it makes sense to trap them.
I'm not familiar enough with pylint and pychecker to say what classes of errors they will catch. As I said I am very inexperienced with python.
These static analysis programs are useful. However, I believe that unless they duplicate the capabilities of the compiler, the compiler will always be in a position to "know" more about the program than any static checker could. It seems wasteful not to take advantage of this to reduce errors where possible.
Update 2:
cdleary - In theory, I agree with you, a static analyzer can do any validation that the compiler can. And in the case of Python, it should be enough.
However, if your compiler is complex enough (especially if you have lots of pragmas that change how compilation occurs, or if like Perl, you can run code at compile time), then the static analyzer must approach the complexity of the compiler/interpreter to do the analysis.
Heh, all this talk of complex compilers and running code at compile time shows my Perl background.
My understanding is that Python does not have pragmas and can not run arbitrary code at compile time. So, unless I am wrong or these features are added, a relatively simple parser in the static analyzer should suffice. It certainly would be helpful to force these checks at every execution. Of course, the way I'd do this is with a pragma.
Once you add pragmas to the mix, you have started down a slippery slope and the complexity of you analyzer must grow in proportion to the power and flexibility you provide in your pragmas. If you are not careful, you can wind up like Perl, and then "only python can parse Python," a future I wouldn't want to see.
Maybe a command line switch would be a better way to add forced static analysis ;)
(In no way do intend to impugn Python's capabilities when I say that it can't futz with compile time behavior like Perl can. I have a hunch that this is a carefully considered design decision, and I can see the wisdom in it. Perl's extreme flexibility at compile time is, IMHO, a great strength and a terrible weakness of the language; I see the wisdom in this approach as well.)
non-local
declaration - as in python.org/dev/peps/pep-3104 – Adolfoadolphuse strict 'vars'
), one from a Perlmonk and one from a Pythonic perspective: perlmonks.org/?node_id=755790 mail.python.org/pipermail/python-3000/2006-October/003968.html – Worked