Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I make sure all my Python code "compiles"?

My background is C and C++. I like Python a lot, but there's one aspect of it (and other interpreted languages I guess) that is really hard to work with when you're used to compiled languages.

When I've written something in Python and come to the point where I can run it, there's still no guarantee that no language-specific errors remain. For me that means that I can't rely solely on my runtime defense (rigorous testing of input, asserts etc.) to avoid crashes, because in 6 months when some otherwise nice code finally gets run, it might crack due to some stupid typo.

Clearly a system should be tested enough to make sure all code has been run, but most of the time I use Python for in-house scripts and small tools, which ofcourse never gets the QA attention they need. Also, some code is so simple that (if your background is C/C++) you know it will work fine as long as it compiles (e.g. getter-methods inside classes, usually a simple return of a member variable).

So, my question is the obvious - is there any way (with a special tool or something) I can make sure all the code in my Python script will "compile" and run?

like image 463
sharkin Avatar asked Jun 22 '09 12:06

sharkin


People also ask

How do I check if a Python program is compiled?

You can do something like this: import py_compile try: py_compile. compile("file.py", doraise=True) except py_compile.

How Python code gets compiled?

Python first compiles your source code (. py file) into a format known as byte code . Compilation is simply a translation step, and byte code is a lower-level, and platform-independent, representation of your source code. Compiled code is usually stored in .

Can Python compile itself?

No. It is simply impossible to create a Python compiler that creates programs as fast as a C++ compiler does.

Should Python be compiled?

For the most part, Python is an interpreted language and not a compiled one, although compilation is a step. Python code, written in . py file is first compiled to what is called bytecode (discussed in detail further) which is stored with a . pyc or .


1 Answers

Look at PyChecker and PyLint.

Here's example output from pylint, resulting from the trivial program:

print a

As you can see, it detects the undefined variable, which py_compile won't (deliberately).

in foo.py:

************* Module foo
C:  1: Black listed name "foo"
C:  1: Missing docstring
E:  1: Undefined variable 'a'


...

|error      |1      |1        |=          |

Trivial example of why tests aren't good enough, even if they cover "every line":

bar = "Foo"
foo = "Bar"
def baz(X):
    return bar if X else fo0

print baz(input("True or False: "))

EDIT: PyChecker handles the ternary for me:

Processing ternary...
True or False: True
Foo

Warnings...

ternary.py:6: No global (fo0) found
ternary.py:8: Using input() is a security problem, consider using raw_input()
like image 175
Matthew Flaschen Avatar answered Sep 28 '22 11:09

Matthew Flaschen