Skip to content

Python Dos and Don'ts

Hannes Schmidt edited this page Dec 9, 2015 · 15 revisions
  • No need for threading.Event to signal boolean conditions between threads. Use threading.Event only if you need to efficiently block on the event to occur. Otherwise use a simple bool variable. The GIL takes care of the rest.

  • Don't use format() or % to format log messages. The logger's debug(), info(), warn(), etc. methods are all variadic, and the extra arguments will be interpolated into the log message. IOW,

    logger.info('Hello, %s' % world)
    

    is equivalent to

    logger.info('Hello, %s', world)
    

    just less efficient if the log level set above info. String interpolation isn't exactly cheap so its desirable to only do it if the log message is actually delivered.

  • Don't waste pixels, use single-quoted strings by default.

  • No need to call threading.Queue.task_done() unless you intend to call join() on that queue. Note that threading.Queue.join() is different from threading.Thread.join().

  • Avoid backslash for line continuations. Python can infer a line continuation if it occurs within a balanced construct like parentheses, braces and brackets. I sometimes even introduce an otherwise redundant pair of parens if that lets me avoid backslashes. So don't

    log( "Bla, bla, bla %s %s %s", foo, \
         bar, \
         ding )
    

    but do

    log( "Bla, bla, bla %s %s %s", foo,
         bar,
         ding )
    
    

    And don't

    from germany import bmw, \
        mercedes, \
        audi
    

    but do

    from germany import (bmw,
        mercedes, 
        audi)