Storm was designed from the ground up to be usable with any programming language. At the core of Storm is a thrift definition for defining and submitting topologies. Since thrift can be used in any language, topologies can be defined and submitted in any language.
Similarly, spouts and bolts can be defined in any language. Non-JVM spouts and bolts communicate with Storm over a JSON-based protocol over stdin/stdout. Adapters that implement this protocol exist for Ruby, Python, JavaScript, and Perl. You can refer to https://github.com/apache/storm/tree/master/storm-multilang to find out about the implementation of these adapters.
Storm-starter has an example topology, https://github.com/apache/storm/tree/master/examples/storm-starter/multilang/resources, which implements one of the bolts in Python.