<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~files/atom.xsl"?>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedpress="https://feed.press/xmlns" xmlns:media="http://search.yahoo.com/mrss/">
  <feedpress:locale>en</feedpress:locale>
  <feedpress:newsletterId>pytips</feedpress:newsletterId>
  <link rel="hub" href="http://feedpress.superfeedr.com/"/>
  <title>Bite Sized Python Tips</title>
  <link href="http://yasoob.github.io/blog/" rel="alternate"/>
  <link href="https://feedpress.me/pytips" rel="self"/>
  <id>http://yasoob.github.io/blog/</id>
  <updated>2013-12-04T01:44:00-05:00</updated>
  <entry>
    <title>Python decorators finally demystified</title>
    <link href="http://yasoob.github.io/blog/python-decorators-demystified" rel="alternate"/>
    <updated>2013-12-04T01:44:00-05:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-12-04:python-decorators-demystified</id>
    <summary type="html">&lt;p&gt;Hi there guys! I hope all of you are fine and doing well. Recently I was hanging out on a python related IRC where I got a request from someone to write an article on decorators in Python. It is perhaps one of the most difficult concept to grasp. So as usual without wasting anytime let get on with it.&lt;/p&gt;
&lt;h2&gt;- Everything in python is an object (Functions too!):&lt;/h2&gt;
&lt;p&gt;First of all let's understand functions in python:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;yasoob&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;hi &amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c"&gt;#output: &amp;#39;hi yasoob&amp;#39;&lt;/span&gt;

&lt;span class="c"&gt;#We can even assign a function to a variable like&lt;/span&gt;
&lt;span class="n"&gt;greet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hi&lt;/span&gt;
&lt;span class="c"&gt;#We are not using parentheses here because we are not calling the function hi&lt;/span&gt;
&lt;span class="c"&gt;#instead we are just putting it into the greet variable. Let&amp;#39;s try to run this&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c"&gt;#output: &amp;#39;hi yasoob&amp;#39;&lt;/span&gt;

&lt;span class="c"&gt;#lets see what happens if we delete the old hi function!&lt;/span&gt;
&lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;hi&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c"&gt;#outputs: NameError&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c"&gt;#outputs: &amp;#39;hi yasoob&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2&gt;- Defining functions within functions:&lt;/h2&gt;
&lt;p&gt;So those are the basics when it comes to functions. Lets take your knowledge one step further! In Python we can define functions inside other functions. You might be wondering what sorcery is this! Let me explain it with an example.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;yasoob&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;now you are inside the hi() function&amp;quot;&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;now you are in the greet() function&amp;quot;&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;welcome&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;now you are in the welcome() function&amp;quot;&lt;/span&gt;

    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;welcome&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;now you are back in the hi() function&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c"&gt;#output:now you are inside the hi() function&lt;/span&gt;
&lt;span class="c"&gt;#       now you are in the greet() function&lt;/span&gt;
&lt;span class="c"&gt;#       now you are in the welcome() function&lt;/span&gt;
&lt;span class="c"&gt;#       now you are back in the hi() function&lt;/span&gt;

&lt;span class="c"&gt;# This shows that whenever you call hi(), greet() and welcome()&lt;/span&gt;
&lt;span class="c"&gt;# are also called. However the greet() and welcome() functions&lt;/span&gt;
&lt;span class="c"&gt;# are not available outsite the hi() function e.g:&lt;/span&gt;

&lt;span class="n"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c"&gt;#outputs: NameError: name &amp;#39;greet&amp;#39; is not defined&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So now we know that we can define functions in other functions. In simpler words we can make nested functions. Now you need to learn one more thing that functions can return functions too. &lt;/p&gt;
&lt;h2&gt;- Returning functions from within functions:&lt;/h2&gt;
&lt;p&gt;It is not necessary to execute a function within another function, we can return it as an output as well. Let's take a look at it with an example!&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;yasoob&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;now you are in the greet() function&amp;quot;&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;welcome&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;now you are in the welcome() function&amp;quot;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;yasoob&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;greet&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;welcome&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="c"&gt;#outputs: &amp;lt;function greet at 0x7f2143c01500&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;#This clearly shows that `a` now points to the greet() function in hi()&lt;/span&gt;
&lt;span class="c"&gt;#Now try this&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c"&gt;#outputs: now you are in the greet() function&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Just take a look at the code again! In the if/else clause we are returning greet and welcome, not greet() and welcome(). Why is that? It is so because when you put parentheses around it the function gets executed whereas if you don't put parenthesis around it then it can be passed around and can be assigned to other variables without executing it. Did you get it ? Let me explain it a little bit in more detail. When we write &lt;code&gt;a = hi()&lt;/code&gt; hi() gets executed and because the name is &lt;code&gt;yasoob&lt;/code&gt; by default, the function greet is returned. If we change the statement to &lt;code&gt;a = hi(name = "ali")&lt;/code&gt; then the welcome function will be returned. We can also do &lt;code&gt;print hi()()&lt;/code&gt; which outputs &lt;code&gt;now you are in the greet() function&lt;/code&gt;. I hope you have not fainted by now. Was it difficult ? No? I guess you are in the mood to finally learn about decorators! Lets continue our talk and move forward.&lt;/p&gt;
&lt;h2&gt;- Giving a function as an argument to another function:&lt;/h2&gt;
&lt;p&gt;Lets take a look at an example:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;hi yasoob!&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;doSomethingBeforeHi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;I am doing some  boring work before executing hi()&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;doSomethingBeforeHi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;#outputs:I am doing some  boring work before executing hi()&lt;/span&gt;
&lt;span class="c"&gt;#        hi yasoob!&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Congratulations! You have all of the knowledge to entitle you as a decorator wrangler! Oh wait, I still haven't told you what decorators really are. Here is a short definition &lt;code&gt;decorators let you execute code before and after the function they decorate&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;- Writing your first decorator:&lt;/h2&gt;
&lt;p&gt;You have already written your first decorator! Do you know when? In the last example we actually made a decorator! Lets modify the previous decorator and make a little bit more usable program:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;a_new_decorator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a_func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;wrapTheFunction&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;I am doing some  boring work before executing a_func()&amp;quot;&lt;/span&gt;

        &lt;span class="n"&gt;a_func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;I am doing some boring work after executing a_func()&amp;quot;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapTheFunction&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;a_function_requiring_decoration&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;I am the function which needs some decoration to remove my foul smell&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;a_function_requiring_decoration&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c"&gt;#outputs: &amp;quot;I am the function which needs some decoration to remove my foul smell&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;a_function_requiring_decoration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a_new_decorator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a_function_requiring_decoration&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;#now a_function_requiring_decoration is wrapped by wrapTheFunction()&lt;/span&gt;

&lt;span class="n"&gt;a_function_requiring_decoration&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c"&gt;#outputs:I am doing some  boring work before executing a_function_requiring_decoration()&lt;/span&gt;
&lt;span class="c"&gt;#        I am the function which needs some decoration to remove my foul smell&lt;/span&gt;
&lt;span class="c"&gt;#        I am doing some boring work after executing a_function_requiring_decoration()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Did you get it? We just applied the previously learned principles. This is exactly what the decorators do in python! They wrap a function and modify its behaviour in one way or the another. Now you might be wondering that we did not use the &lt;code&gt;@&lt;/code&gt; anywhere in our code? That is just a short way of making up a decorated function. Here is how we could have run the previous code sample using &lt;code&gt;@&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nd"&gt;@a_new_decorator&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;a_function_requiring_decoration&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;I am the function which needs some decoration to remove my foul smell&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;a_function_requiring_decoration&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c"&gt;#outputs: I am doing some  boring work before executing a_function_requiring_decoration()&lt;/span&gt;
&lt;span class="c"&gt;#         I am the function which needs some decoration to remove my foul smell&lt;/span&gt;
&lt;span class="c"&gt;#         I am doing some boring work after executing a_function_requiring_decoration()&lt;/span&gt;

&lt;span class="c"&gt;#the @a_new_decorator is just a short way of saying:&lt;/span&gt;
&lt;span class="n"&gt;a_function_requiring_decoration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a_new_decorator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a_function_requiring_decoration&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2&gt;- Decorators Demystified:&lt;/h2&gt;
&lt;p&gt;I hope you now have a basic understanding of how decorators work in Python. They are not something to be afraid of at all. In addition, we can chain two or more than two decorators! For example:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;bread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;lt;/&amp;#39;&amp;#39;&amp;#39;&amp;#39;&amp;#39;&amp;#39;\&amp;gt;&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;lt;\______/&amp;gt;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;#tomatoes#&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;~salad~&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sandwich&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;food&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;--ham--&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;food&lt;/span&gt;

&lt;span class="n"&gt;sandwich&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c"&gt;#outputs: --ham--&lt;/span&gt;
&lt;span class="n"&gt;sandwich&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ingredients&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sandwich&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;sandwich&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c"&gt;#outputs:&lt;/span&gt;
&lt;span class="c"&gt;#&amp;lt;/&amp;#39;&amp;#39;&amp;#39;&amp;#39;&amp;#39;&amp;#39;\&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;# #tomatoes#&lt;/span&gt;
&lt;span class="c"&gt;# --ham--&lt;/span&gt;
&lt;span class="c"&gt;# ~salad~&lt;/span&gt;
&lt;span class="c"&gt;#&amp;lt;\______/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;In the following example &lt;a href="http://stackoverflow.com/users/9951/e-satis"&gt;e-satis&lt;/a&gt; really does a great job demonstrating how decorators are used. We can run the previous example as so:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nd"&gt;@bread&lt;/span&gt;
&lt;span class="nd"&gt;@ingredients&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sandwich&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;food&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;--ham--&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;food&lt;/span&gt;

&lt;span class="n"&gt;sandwich&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c"&gt;#outputs:&lt;/span&gt;
&lt;span class="c"&gt;#&amp;lt;/&amp;#39;&amp;#39;&amp;#39;&amp;#39;&amp;#39;&amp;#39;\&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;# #tomatoes#&lt;/span&gt;
&lt;span class="c"&gt;# --ham--&lt;/span&gt;
&lt;span class="c"&gt;# ~salad~&lt;/span&gt;
&lt;span class="c"&gt;#&amp;lt;\______/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The order in which you use decorators matters and can change the whole behaviour of your decorated function if they are not executed in the intended order. Suppose you write this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nd"&gt;@ingredients&lt;/span&gt;
&lt;span class="nd"&gt;@bread&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sandwich&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;food&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;--ham--&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;food&lt;/span&gt;

&lt;span class="n"&gt;sandwich&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c"&gt;#outputs:&lt;/span&gt;
&lt;span class="c"&gt;##tomatoes#&lt;/span&gt;
&lt;span class="c"&gt;#&amp;lt;/&amp;#39;&amp;#39;&amp;#39;&amp;#39;&amp;#39;&amp;#39;\&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;# --ham--&lt;/span&gt;
&lt;span class="c"&gt;#&amp;lt;\______/&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;# ~salad~&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Nobody wants a sandwich with tomato on the top and salad on the bottom. This demonstrates why you should not mix up the arrangement of the decorators; otherwise you'll pay the price. In our case we paid the price by ruining our beautiful sandwich.&lt;/p&gt;
&lt;p&gt;I hope you learned something useful from this post! If there's any demand I will cover some more gotchas and features of decorators in the future. Please share your views in the comments below. If you have any suggestions, then please do tell me about them. You can also follow me on facebook, twitter, or you can send me an email. The links to my social media accounts are at the bottom of the post. Farewell, and don't forget to subscribe to my blog, tweet, and share this post on facebook.&lt;/p&gt;</summary>
    <category term="decorator-pattern"/>
    <category term="decorators"/>
    <category term="design-patterns"/>
    <category term="patterns"/>
    <category term="programming"/>
    <category term="python"/>
    <category term="python decorators"/>
  </entry>
  <entry>
    <title>Kivy 101: How to Use BoxLayouts</title>
    <link href="http://yasoob.github.io/blog/kivy-101-how-to-use-boxlayouts" rel="alternate"/>
    <updated>2013-12-02T22:18:00-05:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-12-02:kivy-101-how-to-use-boxlayouts</id>
    <summary type="html">&lt;p&gt;Recently I've started learning about Kivy, a Python Natural User Interface (NUI) toolkit. As I understand it, Kivy is kind of a spiritual successor to &lt;a href="http://pymt.eu/"&gt;pyMT&lt;/a&gt;, which you can read more about &lt;a href="http://kivy.org/docs/faq.html#how-is-kivy-related-to-pymt"&gt;here&lt;/a&gt;. In this article, we will be learning how Kivy handles layout management. While you can position widgets using x/y coordinates, in every GUI toolkit I've used, it's almost always better to use some kind of layout management that the toolkit provides. This allows the widgets to resize and move appropriately as the user changes the window's size. In Kivy, these things &lt;strong&gt;Layouts&lt;/strong&gt;. If you've used wxPython, they are analogous to wxPython's sizers.&lt;/p&gt;
&lt;p&gt;I should also note that Kivy can do layouts in two different ways. The first way is to do Layouts with Python code only. The second way is to use a mixture of Python and Kv language. This is to promote the model-view-controller way of doing things. It looks kind of like CSS and reminds me a little of wxPython and XRC. We will look at how to use both methods in this article. While Kivy supports multiple types of Layouts, this article will be focusing only on the &lt;strong&gt;BoxLayout&lt;/strong&gt;. We will show how to nest BoxLayouts.&lt;!--more--&gt;&lt;/p&gt;
&lt;h2&gt;Kivy, Python and BoxLayout&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://freepythontips.files.wordpress.com/2013/11/kivy_hboxlayout.png"&gt;&lt;img class="alignnone size-medium wp-image-395" alt="kivy_hboxlayout" src="http://freepythontips.files.wordpress.com/2013/11/kivy_hboxlayout.png?w=300" width="300" height="236" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Creating a BoxLayout in Kivy using Python is actually pretty easy and quite intuitive. We'll start out with a code example and then follow the code with an explanation. Let's get started!&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;kivy&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;random&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.button&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Button&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.boxlayout&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;

&lt;span class="n"&gt;red&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;green&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;blue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;purple&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c"&gt;########################################################################&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HBoxLayoutExample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="sd"&gt;    Horizontally oriented BoxLayout example class&lt;/span&gt;
&lt;span class="sd"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

    &lt;span class="c"&gt;#----------------------------------------------------------------------&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="sd"&gt;        Horizontal BoxLayout example&lt;/span&gt;
&lt;span class="sd"&gt;        &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;colors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;red&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;green&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;purple&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;btn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Button #&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                         &lt;span class="n"&gt;background_color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                         &lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;layout&lt;/span&gt;

&lt;span class="c"&gt;########################################################################&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;VBoxLayoutExample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="sd"&gt;    Vertical oriented BoxLayout example class&lt;/span&gt;
&lt;span class="sd"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

    &lt;span class="c"&gt;#----------------------------------------------------------------------&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;setOrientation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;orient&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;orient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;orient&lt;/span&gt;

    &lt;span class="c"&gt;#----------------------------------------------------------------------&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;orientation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;orient&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;btn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Button #&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;layout&lt;/span&gt;

&lt;span class="c"&gt;#----------------------------------------------------------------------&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HBoxLayoutExample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c"&gt;#app = VBoxLayoutExample()&lt;/span&gt;
    &lt;span class="c"&gt;#app.setOrientation(orient=&amp;quot;vertical&amp;quot;)&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Here we have created a vertically oriented BoxLayout class and a horizontally oriented BoxLayout class. Each class contains 5 buttons with random background colors. The colors follow RGBA, but can have individual values that are between zero and one. Oddly enough, if you use numbers greater than one, the color becomes brighter. I happened to use 255 instead of 1 when I created the screenshot above, so if you happen to run this code and see a more muted set of colors, that's why.&lt;/p&gt;
&lt;p&gt;To make the examples extremely simple, we only import Kivy's App, Button and BoxLayout classes. The BoxLayout class accepts several arguments, but we'll focus on the following 3: orientation, padding and spacing. Because BoxLayout is a sub-class of Layout and Widget, it inherits many other methods and keyword arguments that are not covered here. But back to the arguments we currently care about. The &lt;strong&gt;padding&lt;/strong&gt; argument tells Kivy how much space there should be between the Layout and its children, whereas the &lt;strong&gt;spacing&lt;/strong&gt; arguments tells it how much spacing there should be between the children.&lt;/p&gt;
&lt;p&gt;To create the buttons, we use a simple loop that loops over a small range of numbers. Each iteration creates a button with a random background color and adds that button to the Layout instance. Then we return the layout at the end.&lt;/p&gt;
&lt;p&gt;The vertical BoxLayout example in the &lt;strong&gt;VBoxLayoutExample&lt;/strong&gt; class is slightly different in that I thought it would be fun to be able to set the orientation programmatically. The code is pretty much the same except that I added a &lt;strong&gt;setOrientation&lt;/strong&gt; method. Note that if you call setOrientation again, it will have no effect. As one of my commenters so kindly pointed out, you would need to bind the orientation to the App orient property or use the Kv language to achieve this.&lt;/p&gt;
&lt;p&gt;If you comment out the call to &lt;strong&gt;HBoxLayoutExample&lt;/strong&gt; at the end of the script and un-comment out the other two lines, then you should end up seeing something like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://freepythontips.files.wordpress.com/2013/11/kivy_vbox.png"&gt;&lt;img class="alignnone size-medium wp-image-396" alt="kivy_vbox" src="http://freepythontips.files.wordpress.com/2013/11/kivy_vbox.png?w=300" width="300" height="236" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Notice that when you don't set a background color, Kivy defaults to a dark grey. Kivy does not try to look like a native application. This may or may not be a big deal to you depending on what sort of program you're trying to achieve, but it should be noted. Now we're ready to learn about nesting!&lt;/p&gt;
&lt;h2&gt;Nesting BoxLayouts&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://freepythontips.files.wordpress.com/2013/11/kv_nested_boxlayout.png"&gt;&lt;img class="alignnone size-medium wp-image-397" alt="kv_nested_boxlayout" src="http://freepythontips.files.wordpress.com/2013/11/kv_nested_boxlayout.png?w=300" width="300" height="236" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nesting BoxLayouts inside of each other is pretty easy with Kivy too. Whenever you go to create an application with a complicated interface that will need nested sizers, you should take some time to sketch the layout out with pencil and paper. Then you can draw boxes around the widgets in different ways to help you visualize which Layouts you'll need and how to nest them in each other. I have found this quite helpful with wxPython and I think it applies to any other GUI toolkit that doesn't have a WYSIWYG editor. By the way, BoxLayouts are very powerful. If you know what you're doing, you can make just about any interface with them alone just be using clever nesting.&lt;/p&gt;
&lt;p&gt;Enough talk, let's look at some code!&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;kivy&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;random&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.button&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Button&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.boxlayout&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;

&lt;span class="n"&gt;red&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;green&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;blue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;purple&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c"&gt;########################################################################&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NestedLayoutExample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="sd"&gt;    An example of nesting three horizontally oriented BoxLayouts inside&lt;/span&gt;
&lt;span class="sd"&gt;    of one vertically oriented BoxLayout&lt;/span&gt;
&lt;span class="sd"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

    &lt;span class="c"&gt;#----------------------------------------------------------------------&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="sd"&gt;        Horizontal BoxLayout example&lt;/span&gt;
&lt;span class="sd"&gt;        &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;main_layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;orientation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;vertical&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;colors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;red&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;green&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;purple&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;h_layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;btn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Button #&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                             &lt;span class="n"&gt;background_color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                             &lt;span class="p"&gt;)&lt;/span&gt;

                &lt;span class="n"&gt;h_layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;main_layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h_layout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;main_layout&lt;/span&gt;

&lt;span class="c"&gt;#----------------------------------------------------------------------&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NestedLayoutExample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This example is very similar to the last one. The devil is in the details though. Here we have a nested for loop that creates 3 BoxLayouts that contain 5 buttons a piece. Each Layout is then inserted into the top level Layout at the end of each iteration in the outside loop. In case you missed it, scroll back up to see how it turned out. The trick is to create one top-level or main Layout and add other Layouts to it. Now let's turn our attention to learning how to do these things with the Kv language.&lt;/p&gt;
&lt;h2&gt;Kv+Python and BoxLayout&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://freepythontips.files.wordpress.com/2013/11/kivy_vbox.png"&gt;&lt;img class="alignnone size-medium wp-image-396" alt="kivy_vbox" src="http://freepythontips.files.wordpress.com/2013/11/kivy_vbox.png?w=300" width="300" height="236" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It's almost always a little painful to learn a new language. Fortunately, the Kv language actually follows Python pretty closely, including Python's requirement of using indentation levels to denote when a section of code begins and ends. You may want to spend a few minutes reading about the Kv language on the &lt;a href="http://kivy.org/docs/guide/lang.html"&gt;Kivy website&lt;/a&gt;. Whenever you're ready, we can continue. First we'll start off with the Python code:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;# kvboxlayout.py&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.boxlayout&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;

&lt;span class="c"&gt;########################################################################&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;KVMyHBoxLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BoxLayout&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="c"&gt;########################################################################&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;KVBoxLayoutApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

    &lt;span class="c"&gt;#----------------------------------------------------------------------&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;KVMyHBoxLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c"&gt;#----------------------------------------------------------------------&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;KVBoxLayoutApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This code is much simpler than our previous examples, but it's also rather mysterious. First of all, we create an empty sub-class of BoxLayout. Then we create our App class which has a &lt;strong&gt;build&lt;/strong&gt; method that just returns an instance of the empty BoxLayout class. What's going on here? Well we have to look at the Kv file to find out!&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MyButton&lt;/span&gt;&lt;span class="nd"&gt;@Button&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;font_size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MyButton&lt;/span&gt;&lt;span class="nd"&gt;@Button&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;orientation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;horizontal&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;MyButton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Btn1&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;background_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;MyButton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Btn2&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;background_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;MyButton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Btn3&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;background_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;MyButton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Btn4&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;background_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;MyButton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Btn5&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;background_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;When you save the code above, you'll have to name it to be the same as the App class, but with a .kv instead of a .py and in lowercase. That means the name of this Kv file needs to be &lt;strong&gt;kvboxlayout.kv&lt;/strong&gt;. You will note that you also need to strip off the App part of the class name such that KVBoxLayoutApp becomes kvboxlayout. Yes, it's a little confusing. If you don't follow the naming conventions correctly, the file will run but you will have an empty black window.&lt;/p&gt;
&lt;p&gt;Anyway, first off in the Kv file, we have a section that starts with &lt;strong&gt;:&lt;/strong&gt;. This tells Kivy that we are sub-classing the Button class and calling our sub-class &lt;strong&gt;MyButton&lt;/strong&gt;. Then we indent the required four spaces and set the button's label color and font size. Next we create a BoxLayout section. Notice that we didn't create a sub-class this time. Then we tell it what orientation it should be and add 5 MyButton instances, each one having its own individual label and color.&lt;/p&gt;
&lt;p&gt;One of the core Kivy developers pointed out that by creating the BoxLayout in this manner, I am redefining the BoxLayout for all usages. This is &lt;strong&gt;not&lt;/strong&gt; a good thing, even if it does make the example simpler. Thus in the next example, we'll stop doing that and do it the right way instead!&lt;/p&gt;
&lt;h2&gt;Nesting BoxLayouts with Kv&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://freepythontips.files.wordpress.com/2013/11/kv_nested_boxlayout.png"&gt;&lt;img class="alignnone size-medium wp-image-397" alt="kv_nested_boxlayout" src="http://freepythontips.files.wordpress.com/2013/11/kv_nested_boxlayout.png?w=300" width="300" height="236" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nesting BoxLayouts in Kv is a little confusing at first, but once you get the hang of it, you'll find that it's really quite easy. We'll start out with the Python code, take a look at how it works and then look at the Kv code.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.boxlayout&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BoxLayout&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;kivy.uix.widget&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Widget&lt;/span&gt;

&lt;span class="c"&gt;########################################################################&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HBoxWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Widget&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="c"&gt;########################################################################&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;VBoxWidget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Widget&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="c"&gt;########################################################################&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;KVNestedBoxLayoutApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

    &lt;span class="c"&gt;#----------------------------------------------------------------------&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;VBoxWidget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c"&gt;#----------------------------------------------------------------------&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;KVNestedBoxLayoutApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This time around, we need to create two generic Widget classes: HBoxWidget and VBoxWidget. These are actually dummy classes that become BoxLayouts in the Kv code. Speaking of which, let's take a look at that now. Note that you'll need to name the Kv file &lt;strong&gt;kvnestedboxlayout.kv&lt;/strong&gt;, which you'll note, is a lowercase version of &lt;strong&gt;KVNestedBoxLayoutApp&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;font_size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;

&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;BoxLayout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;
        &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;
        &lt;span class="n"&gt;orientation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;horizontal&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;MyButton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Btn1&amp;quot;&lt;/span&gt;
            &lt;span class="n"&gt;background_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="n"&gt;MyButton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Btn2&amp;quot;&lt;/span&gt;
            &lt;span class="n"&gt;background_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="n"&gt;MyButton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Btn3&amp;quot;&lt;/span&gt;
            &lt;span class="n"&gt;background_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="n"&gt;MyButton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Btn4&amp;quot;&lt;/span&gt;
            &lt;span class="n"&gt;background_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="n"&gt;MyButton&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Btn2&amp;quot;&lt;/span&gt;
            &lt;span class="n"&gt;background_color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;BoxLayout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;
        &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;
        &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;foo_bar&lt;/span&gt;
        &lt;span class="n"&gt;orientation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;vertical&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;HBoxWidget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;HBoxWidget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The button code is the same as before. Next we have the &lt;strong&gt;HBoxWidget&lt;/strong&gt; which we define as a horizontal BoxLayout with 5 buttons in it. Then we create an instance of &lt;strong&gt;VBoxWidget&lt;/strong&gt; that is a vertical BoxLayout, but this Layout contains two instances of the HBoxWidget. You'll note that in the Python code's build method, we are returning the VBoxWidget, so that's where the action is. If you remove those two HBoxWidget calls, the result will be an empty black window.&lt;/p&gt;
&lt;p&gt;There is another way to use Kv files in Kivy. It is through the kivy.lang.Builder.load_file (or load_string) API, which gives you the ability to load Kv files without needing to remember to name the Kv file in some special way. You can read about the API on their &lt;a href="http://kivy.org/docs/api-kivy.lang.html#kivy.lang.Builder" target="_blank"&gt;website&lt;/a&gt; and see an example of it in action in the Kivy &lt;a href="https://github.com/kivy/kivy/blob/master/examples/widgets/screenmanager.py" target="_blank"&gt;examples on github&lt;/a&gt;. The only caveat to using this method is that you need to be careful not to load the same file twice or your UI may get messed up.&lt;/p&gt;
&lt;h2&gt;Wrapping Up&lt;/h2&gt;
&lt;p&gt;This just scratches the surface of Kivy's Layout system. There are 6 other Layout types available. However, I think you'll find that the examples in this article will get you started down the road of successfully creating cool Kivy applications of your very own. If you need help learning Kivy, there's a pretty good set of documentation on their website. They also have a &lt;a href="https://groups.google.com/forum/#!forum/kivy-users" target="_blank"&gt;Google Group&lt;/a&gt; and a &lt;a href="irc://freenode.net/kivy" target="_blank"&gt;#kivy channel&lt;/a&gt; on freenode.&lt;/p&gt;
&lt;h2&gt;Related Readings&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Kivy's &lt;a href="http://kivy.org/docs/gettingstarted/layouts.html"&gt;Getting Started with Layouts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kivy's &lt;a href="http://kivy.org/docs/guide/widgets.html#organize-with-layouts?"&gt;programming guide&lt;/a&gt; also has coverage on layouts&lt;/li&gt;
&lt;li&gt;A simple nested Layout example on &lt;a href="https://gist.github.com/Kovak/6206701"&gt;github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kivy's &lt;a href="http://kivy.org/docs/guide/lang.html"&gt;Kv language page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Other &lt;a href="https://github.com/Kovak/KivyExamples"&gt;Kivy examples on github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Download the Source&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2013/11/kivy_box_layouts.tar"&gt;kivy_box_layouts.tar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.blog.pythonlibrary.org/wp-content/uploads/2013/11/kivy_box_layouts.zip"&gt;kivy_box_layouts.zip&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note: This is an official cross-posting of an article from the &lt;a href="http://www.blog.pythonlibrary.org/"&gt;Mouse Vs Python blog&lt;/a&gt;. You can read the original &lt;a href="http://www.blog.pythonlibrary.org/2013/11/25/kivy-101-how-to-use-boxlayouts/"&gt;here&lt;/a&gt;.&lt;/p&gt;</summary>
    <category term="Kivy"/>
    <category term="python"/>
    <category term="gui dev"/>
    <category term="python gui"/>
    <category term="mobile python"/>
    <category term="python mobile dev in kivy"/>
  </entry>
  <entry>
    <title>Reverse engineering myspace</title>
    <link href="http://yasoob.github.io/blog/reverse-engineering-myspace" rel="alternate"/>
    <updated>2013-11-23T01:44:00-05:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-11-23:reverse-engineering-myspace</id>
    <summary type="html">&lt;p&gt;Hi guys! In todays post we will be looking into myspace.com and check whether it is possible to download songs with python or not. If it is possible then we will make a python script which will assist us in downloading the songs. I guess you are as eager to start as I am. So lets get started. However let me make it clear in the beginning that this is only for educational purposes.&lt;/p&gt;
&lt;h2&gt;Tools :&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;python - I am using py2k&lt;/li&gt;
&lt;li&gt;browser - I am using chrome&lt;/li&gt;
&lt;li&gt;rtmpdump &amp;amp; rtmpsrv&lt;/li&gt;
&lt;li&gt;internet connection&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Lets start :&lt;/h2&gt;
&lt;p&gt;So lets start. Lets go to myspace:&lt;/p&gt;
&lt;p&gt;&lt;img alt="myspace.com" src="http://freepythontips.files.wordpress.com/2013/11/screenshot-from-2013-11-22-190528.png" /&gt;&lt;/p&gt;
&lt;p&gt;We don't need this page. Lets go to a song page for instance I am going to open &lt;a href="https://myspace.com/brunomars/music/song/somewhere-in-brooklyn-69059954-74825216"&gt;this page&lt;/a&gt;. Now lets check out the source of the page to see whether we can find any mp3 link. What I usually do is that I right click on the name of the song and click on "Inspect this". Usually the name is in the song link on most websites. So just do this and see if you get anything. Here is what I got:&lt;/p&gt;
&lt;p&gt;&lt;img alt="inspecting the html" src="http://freepythontips.files.wordpress.com/2013/11/screenshot-from-2013-11-22-215408.png" /&gt;&lt;/p&gt;
&lt;p&gt;Can you see that data stream url ? Oh yes the one which I have highlighted. That is an rtmp url. RTMP is a streaming protocol. Now the problem is that we can not directly download the rtmp links so what should we do now ? We are very lucky because there is already a software which can help us in downloading this and it is called&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;rtmpdump&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;However rtmpdump requires some additional parameters for downloading the song. They are the play path, stream url, file name and etc. So how do we get those ? So again we are very lucky because there is a software for this as well and it is developed by the same people who have developed rtmpdump. This one is called&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;rtmpsrv&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Just search for it on google and download it. This is like a proxy. It scans all of your data and searches for rtmp streams. When it has found a stream it just outputs a single command which can be used to download a file with rtmpdump. However first we have to route all the tcp traffic to port 1935. Thats the port where rtmpsrv runs. In order to do so just type this in the terminal:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;iptables&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;nat&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="n"&gt;OUTPUT&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="n"&gt;tcp&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;dport&lt;/span&gt; &lt;span class="mi"&gt;1935&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="n"&gt;REDIRECT&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This will add a firewall rule. Now go to myspace and play a song. After you hit play and wait for some seconds then you will see that a couple of lines are outputted by rtmpsrv. Check this out:&lt;/p&gt;
&lt;p&gt;&lt;img alt="rtmpsrv" src="http://freepythontips.files.wordpress.com/2013/11/screenshot-from-2013-11-22-223634.png" /&gt;&lt;/p&gt;
&lt;p&gt;Now if you copy this command and paste it in the terminal you will see that rtmpdump will start to download the file. Now close rtmpsrv and revert the firewall rule by using this command :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;iptables&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;nat&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt; &lt;span class="n"&gt;OUTPUT&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="n"&gt;tcp&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;dport&lt;/span&gt; &lt;span class="mi"&gt;1935&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="n"&gt;REDIRECT&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now comes the main part. It is not convenient to go through all of these steps again and again just to download a single song. Now we need to automate this and for that we will use python. After doing a little bit of tinkering I saw that only the -y and -p parameters are changed for every song. Further down the lane we can see that the -p parameter is just the url of the song page and the -y parameter is taken from the rtmp link which we found on the song page.&lt;/p&gt;
&lt;h2&gt;Writing Python script :&lt;/h2&gt;
&lt;p&gt;So lets first make a script which will get the rtmp link from the page. Here is my solution:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;r&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;
&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;song_page_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rtmp_link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;data-stream-url=&amp;quot;(.+?)&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; 
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;rtmp_link&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So now we have a script which gets the rtmp link. Now we need to modify this script so that it outputs the required rtmpdump command. Again here is my solution :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;r&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;
&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;song_page_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rtmp_link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;data-stream-url=&amp;quot;(.+?)&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; 
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rtmp_link&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;song_page_url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;rtmp_command&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;rtmpdump -r &amp;quot;rtmpte://fms.ec-music.myspacecdn.com/&amp;quot; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="s"&gt;-a &amp;quot;&amp;quot; -f &amp;quot;LNX 11,9,900,152&amp;quot; -o &amp;quot;{}.flv&amp;quot; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="s"&gt;-W &amp;quot;http://lads.myspacecdn.com/music/sdkwrapper/SDKWrapper.2.2.16.swf&amp;quot; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="s"&gt;-p &amp;quot;http://www.myspace.com&amp;quot; -y &amp;quot;{}&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So now we just need to open rtmpdump with the parameters. For that I will be using the subprocess module. Here is the final code:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;subprocess&lt;/span&gt;

&lt;span class="n"&gt;song_page_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;song_page_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
&lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;data-stream-url=&amp;quot;(rtmpe://[^;]+);([^&amp;quot;]+)&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rtmpurl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;playpath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;song_page_url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;.flv&amp;#39;&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;downloading&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;
&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;rtmpdump&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;-o&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;-r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rtmpurl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;-y&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;playpath&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                    &lt;span class="n"&gt;stderr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEVNULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Just run this file like this :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;python&lt;/span&gt; &lt;span class="n"&gt;myspace&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;https:&lt;/span&gt;&lt;span class="sr"&gt;//m&lt;/span&gt;&lt;span class="n"&gt;yspace&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="sr"&gt;/brunomars/m&lt;/span&gt;&lt;span class="n"&gt;usic&lt;/span&gt;&lt;span class="sr"&gt;/song/som&lt;/span&gt;&lt;span class="n"&gt;ewhere&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;brooklyn&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;69059954&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;74825216&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Thats it! We now have a simple script that will download myspace songs for us. I know you are thinking about more features in this script. Let me give you some ideas. This script downloads just songs and does not have any input validation in place. Maybe you can make a similar script for videos ? When you make something do let me know. That was todays tutorial. I will see you later and don't forget to follow this blog, &lt;a href="https://www.facebook.com/freepythontips"&gt;like it on facebook&lt;/a&gt;, &lt;a href="http://www.twitter.com/yasoobkhalid"&gt;follow me on twitter&lt;/a&gt; and reply below :) This is the best way to repay me. Lastly stay tuned for the next post.&lt;/p&gt;
&lt;p&gt;Disclaimer: Some of the above code can be written more compactly. I wrote it this way so that the beginners could understand what is going on.&lt;/p&gt;</summary>
    <category term="mp3 downloader"/>
    <category term="music downloader"/>
    <category term="myspace downloader"/>
    <category term="myspace.com"/>
    <category term="python"/>
    <category term="reverse engineer"/>
    <category term="tutorial"/>
  </entry>
  <entry>
    <title>Introduction to unittest</title>
    <link href="http://yasoob.github.io/blog/introduction-to-unittest" rel="alternate"/>
    <updated>2013-11-15T23:04:00-05:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-11-15:introduction-to-unittest</id>
    <summary type="html">&lt;p&gt;Hi there folks. I recently thought that I have not written even a single
post about testing in python. Testing is one of the most important part
of any language. In this post I am going to share some information about
unittest with you. So what exactly is unittest ? You might have heard
about it on SO or some other forum.&lt;!--more--&gt; It is a testing framework
for python just like Junit for Java. It comes pre-installed with python
from 2.1. It is easy to use. However there are a lot of other testing
frameworks for python out there as well but I will be focusing on
unittest today as it is the default testing framework for python. So
without wasting any time lets get started.&lt;/p&gt;
&lt;p&gt;The standard workflow while using unittest is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;derive your own class from unittest.TestCase&lt;/li&gt;
&lt;li&gt;write your tests in functions which start with "test_"&lt;/li&gt;
&lt;li&gt;finally write unittest.main() at the end of your file to run the
    tests&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I was also used to be scared by testing. Testing seemed to me as
something from outer space but now I have learned its importance and it
is essential for every programmer to learn it.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;A simple script&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;So lets write a simple script which we can later test. This script is
going to do some math functions for us. So here is the script:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;# save it as math.py&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;n1&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;n2&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;n1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;n2&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So thats our little script. Now lets move forward and write our first
test.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Our first test&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;So as I told you before that every unittest file contains a custom class
derived from unittest.TestCase so lets create that:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;unittest&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;math&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;multiply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestingMath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So that was the first part. Now we need to define our tests. In unittest
there is a setUp() and tearDown() function. The setUp() function is used
to set up the test environment and tearDown() is used to clean up after
a test. We do not need them as they are usually used when a lot of tests
are written for a larger software. The default implementation of setUp()
and tearDown() does nothing. So now lets write our first test by editing
our previous script.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;unittest&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;math&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;multiply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestingMath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;setUp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now save this file as test.py and run it from the command line and you
will see some output like this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;yasoob&lt;/span&gt;&lt;span class="nv"&gt;@yasoob:&lt;/span&gt;&lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;Desktop&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;python&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="o"&gt;..&lt;/span&gt;
&lt;span class="o"&gt;----------------------------------------------------------------------&lt;/span&gt;
&lt;span class="n"&gt;Ran&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;tests&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="mf"&gt;0.000&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="n"&gt;OK&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Congratulations! You have written your very first fully working test
suite in python. Wait! what are those assertEqual() statements there ?
Let me explain them. These assert funtions are the backbones of testing
in unittest. They check whether the result is correct or not. There are
a lot of assert functions in unittest. In our case we used assertEqual()
which checks whether two values are equal or not. We gave 2 parameters
to assertEqual() now the job of assertEqual() is to check whether both
parameters are equal or not. Just for reference some other assert
functions are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;assertTrue(x)&lt;/li&gt;
&lt;li&gt;assertFalse(x)&lt;/li&gt;
&lt;li&gt;assertNotEqual(a, b)&lt;/li&gt;
&lt;li&gt;assertIs(a, b)&lt;/li&gt;
&lt;li&gt;assertIsNot(a, b)&lt;/li&gt;
&lt;li&gt;assertIsNone(x)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Test Discovery&lt;/h2&gt;
&lt;p&gt;So just think about it for a minute. You have a lot of test files and
want to run all of them. The only method which comes to mind is to
manually run all of those files separately. This is possible if you have
10 files but what if you have a 100 files ? That is were automatic test
discovery comes to rescue. So if I have all of my tests in app/tests
directory I would simply run:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;unittest&lt;/span&gt; &lt;span class="n"&gt;discover&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So this command would gather all of the test files in the tests
directory and will run them. I hope that was helpful.&lt;/p&gt;
&lt;h2&gt;Furthur&lt;/h2&gt;
&lt;p&gt;So now you have got some idea of how testing works in python. Remember
that this was just an introduction and there is a whole lot to unittest
than this. If you want to further increase your knowledge then check out
the original &lt;a href="http://docs.python.org/2/library/unittest.html"&gt;python docs about unittest&lt;/a&gt;. I will cover other testing
frameworks as well in the future. I hope you enjoyed this article and do
remember this one tip that the best time to write tests is while
developing. If you write tests bit by bit while developing then they
will not become a burden and your application will be rock solid. Do
share your views in the comments below or feel free to &lt;a href="yasoob.khld@gmail.com"&gt;email me&lt;/a&gt; or
&lt;a href="http://twitter.com/yasoobkhalid"&gt;tweet me&lt;/a&gt;. Last but not the least follow this blog and stay tuned for
the next post.&lt;/p&gt;</summary>
    <category term="mock"/>
    <category term="nose"/>
    <category term="python"/>
    <category term="python testing"/>
    <category term="testing"/>
    <category term="testing in python"/>
    <category term="unittest"/>
    <category term="unittest tutorial"/>
  </entry>
  <entry>
    <title>Recent posts by Guido Van Rossum</title>
    <link href="http://yasoob.github.io/blog/recent-posts-by-guido-van-rossum" rel="alternate"/>
    <updated>2013-11-15T00:13:00-05:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-11-15:recent-posts-by-guido-van-rossum</id>
    <summary type="html">&lt;p&gt;Hi there friends. If you are a python programmer then there is not a
single chance that you don't know Guido. Everyone knows him in the
python community. However for those who don't know about him let me
introduce him to you. He is the creator of python and is known as BDFL.
Now a days he works at dropbox and previously&lt;!--more--&gt; he used to work
at google. In this post I am going to share some of his recent posts
with you. They are very informative and I suggest that you take a look
at them.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="http://python-history.blogspot.ro/2013/11/story-of-none-true-false.html"&gt;The History of Python: The story of None, True and False (and an explanation of literals, keywords and builtins)&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this post Guido tells us about None, True and False and how they
became what they are right now in python.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://plus.google.com/115212051037621986145/posts/YTUxbXYZyfi"&gt;Why Python uses 0-based indexing&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ah so if you are a new programmer then you might have thought why python
as a lot of other languages uses 0-based indexing. There is a reason for
everything and so in this post Guido tells us the reason for why python
uses 0-based indexing.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.dropbox.com/s/83ppa5iykqmr14z/Py2v3Hackers2013.pptx"&gt;Python 2 vs. Python 3: A Restrospective&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The name is self explanatory. This presentation is really useful and you
should definately go through it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://www.dropbox.com/s/essjj4qmmtrhys4/SFMeetup2013.pdf"&gt;Guidos' SF presentation: Tulip: Async I/O for Python 3 @ SF Python Meetup&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this presentation guido tells about Tulip, Asynchronous I/O for
python 3. If you ever wanted to contribute to a core python library but
did not know what to contribute then do take a look at this as this
might be a good chance for you.&lt;/p&gt;
&lt;p&gt;So now let me say goodbye to you. I hope you enjoyed this article as
much as I enjoyed writing it. I will see you guys later. Don't forget to
follow me on &lt;a href="http://twitter.com/yasoobkhalid"&gt;twitter&lt;/a&gt; and follow this blog as well. And finally stay
tuned for the next post as it will be great.&lt;/p&gt;</summary>
    <category term="guido"/>
    <category term="guido talks"/>
    <category term="guido van rossum"/>
    <category term="posts by guido van rossum"/>
    <category term="python"/>
    <category term="python BDFL"/>
  </entry>
  <entry>
    <title>New Python books for GUI development</title>
    <link href="http://yasoob.github.io/blog/new-python-books" rel="alternate"/>
    <updated>2013-11-13T23:35:00-05:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-11-13:new-python-books</id>
    <summary type="html">&lt;p&gt;Hi folks welcome back to yet another article. This one is going to be short. In this post I will be sharing two new books which have recently come out. These books are regarding GUI development in Python. In past several months we have not seen a lot of books focused towards GUI development in Python. Hopefully these two books will fill the gap. So without wasting any time lets look at them.&lt;/p&gt;
&lt;h2&gt;* &lt;a href="http://www.packtpub.com/tkinter-gui-application-development-hotshot/book"&gt;Tkinter GUI Application Development Hotshot :&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Its been a long time since we saw a new Tkinter book out there. This book has received some good critics by the professional python programmers. According to the overview given on the website you will :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Develop 10 real GUI applications using procedural and object-oriented styles&lt;/li&gt;
&lt;li&gt;Write network programs, database-driven programs, multi-threaded programs and more with Tkinter&lt;/li&gt;
&lt;li&gt;A practical guide to discover the best practices involved in writing GUI applications&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;* &lt;a href="http://chimera.labs.oreilly.com/books/1234000000754/"&gt;Test-Driven Development with Python :&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Test-Driven Development with Python focuses on web development, with some coverage of JavaScript.  This book uses a concrete example—the development of a website, from scratch—to teach the TDD metholology. This book is not completed as yet however most of it has been completed. You can read this book online for free or buy it from O'Reilly.&lt;/p&gt;
&lt;p&gt;So now we come to an end of yet another useful post. Do &lt;a href="https://twitter.com/yasoobkhalid"&gt;follow me on twitter&lt;/a&gt;, follow this blog and comment below to share your views and to give me an idea about a future post. I will be waiting for your comments.&lt;/p&gt;</summary>
    <category term="beginner python books"/>
    <category term="best practices"/>
    <category term="books"/>
    <category term="django"/>
    <category term="easy books"/>
    <category term="new python books"/>
    <category term="python"/>
    <category term="tkinter"/>
    <category term="tutorials"/>
  </entry>
  <entry>
    <title>Some Python projects worth looking at</title>
    <link href="http://yasoob.github.io/blog/some-python-projects-worth-looking-at" rel="alternate"/>
    <updated>2013-11-13T23:30:00-05:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-11-13:some-python-projects-worth-looking-at</id>
    <summary type="html">&lt;p&gt;Hi there guys. So a lot has happened while I was away. It has been only
a few weeks and a whole ton of great python project have emerged. In
this post I will share a list of some of the excellent projects I saw in
the past few days. So lets take a look at them without wasting any more
time.&lt;!--more--&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/DanMcInerney/LANs.py"&gt;Lans.py&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This project is interesting mostly for those who are into network
security. This is a single script providing a set of useful commands. It
is a packet parsing/injecting arp spoofer. Check out the github page for
more information&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fomori.org/cherrymusic"&gt;CherryMusic&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CherryMusic is not a new project but it recently got a new release. It
is basically a music streaming server written in python. It allows you
to stream your own music collection to all your devices! I have
personally tested it and really recommend it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://pythonwheels.com/"&gt;Python Wheels&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://pypi.python.org/pypi/wheel"&gt;Wheels&lt;/a&gt; are &lt;a href="http://www.python.org/dev/peps/pep-0427"&gt;the new standard&lt;/a&gt; of python distribution and are
intended to replace eggs. Among other advantages, they offer faster
installation and allow secure digital signing. This project does not
support a lot of python packages at the moment but they are trying to
support as many projects as possible.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dataset.readthedocs.org/en/latest/"&gt;Dataset&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;dataset provides two key functions that make using SQL databases in
Python a breeze. A simple abstraction layer removes most direct SQL
statements without the necessity for a full ORM model and Database
contents can be exported (&lt;em&gt;frozen&lt;/em&gt;) using a &lt;a href="https://dataset.readthedocs.org/en/latest/freezefile.html"&gt;&lt;em&gt;sophisticated plain file
generator&lt;/em&gt;&lt;/a&gt;with JSON and CSV support.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://openpyxl.readthedocs.org/en/latest/"&gt;Openpyxl&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OpenPyxl is a Python library to read/write Excel 2007 xlsx/xlsm files.
It was born from lack of existing library to read/write natively from
Python the new Open Office XML format. Do check this project if you deal
a lot with Excel files. You never know when you find something useful&lt;/p&gt;
&lt;p&gt;If you are still reading then I guess you are hungry for more projects.
Never mind I will do more posts about such things. For the time being do
follow me on &lt;a href="https://twitter.com/yasoobkhalid"&gt;twitter&lt;/a&gt;, follow this blog and comment below to share
your views and to give me an idea about a future post.&lt;/p&gt;</summary>
    <category term="cherrypy"/>
    <category term="dataset"/>
    <category term="learn python"/>
    <category term="new projects"/>
    <category term="openpyxl"/>
    <category term="python"/>
    <category term="python inspiration"/>
    <category term="python projects"/>
    <category term="python wheels"/>
  </entry>
  <entry>
    <title>PyDev 3.0 Released</title>
    <link href="http://yasoob.github.io/blog/pydev-3-0-released" rel="alternate"/>
    <updated>2013-11-13T22:18:00-05:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-11-13:pydev-3-0-released</id>
    <summary type="html">&lt;p&gt;Hi there folks. Its been a long time since I posted here. That was
because my studies were giving me some problems. So no worrys because
the problems are all resolved and I am back with yet another news. So
what is PyDev ? If you have been coding python scripts with eclipse
(it's an IDE) then the chances are that you know what PyDev
is&lt;!--more--&gt;. So for those who are not familiar with pydev read on.
PyDev is a third-party plug-in for Eclipse. It is an Integrated
Development Environment used for programming in Python supporting code
refactoring, graphical debugging, code analysis and many other features.
Recently it's 3.0 version was released after a long break. Some believed
that the development for PyDev had stopped but this release has given
hope to eclipse lovers. According to the official pydev website PyDev
comes with many goodies such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Django integration&lt;/li&gt;
&lt;li&gt;Code completion&lt;/li&gt;
&lt;li&gt;Code completion with auto import&lt;/li&gt;
&lt;li&gt;Type hinting&lt;/li&gt;
&lt;li&gt;Code analysis&lt;/li&gt;
&lt;li&gt;Go to definition&lt;/li&gt;
&lt;li&gt;Refactoring&lt;/li&gt;
&lt;li&gt;Debugger&lt;/li&gt;
&lt;li&gt;Remote debugger&lt;/li&gt;
&lt;li&gt;Tokens browser&lt;/li&gt;
&lt;li&gt;Interactive console&lt;/li&gt;
&lt;li&gt;Unittest integration&lt;/li&gt;
&lt;li&gt;Code coverage&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;and many others&lt;/strong&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I believe it is worth to check out this project. The link to the
official website is &lt;a href="http://pydev.org/"&gt;http://pydev.org/&lt;/a&gt; and &lt;a href="http://www.pydev.blogspot.com.br/2013/11/pydev-30.html"&gt;here is the link&lt;/a&gt; to
this release announcement . Do share your views in the comments below
and stay tuned for the next post. If you know someone who can benefit
from my post then do make sure that you tell them about this blog.&lt;/p&gt;</summary>
    <category term="eclipse python"/>
    <category term="eclipse python plugin"/>
    <category term="news"/>
    <category term="pydev"/>
    <category term="pydev 3.0"/>
    <category term="pydev eclipse"/>
    <category term="python"/>
  </entry>
  <entry>
    <title>Python 3.4 to be equipped with pip by default</title>
    <link href="http://yasoob.github.io/blog/python-3-4-to-be-equipped-with-pip-by-default" rel="alternate"/>
    <updated>2013-10-22T21:59:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-10-22:python-3-4-to-be-equipped-with-pip-by-default</id>
    <summary type="html">&lt;p&gt;Hi there Pythonistas. A news has arrived that&lt;strong&gt;pip&lt;/strong&gt; will be available
by default with python 3.4. &lt;a href="http://www.python.org/dev/peps/pep-0453/"&gt;PEP 453&lt;/a&gt; which was "Explicit
bootstrapping of pip in Python installations" has been accepted. Python
3.4 which has entered into the beta phase after the release of final
alpha will have pip by default. If you are new to python then you might
be &lt;!--more--&gt;wondering what pip is ? Pip is a tool for installing and
managing Python packages. Previously easy_install has been the most
used package manager. &lt;em&gt;Easy_Install&lt;/em&gt; is a python module
(&lt;code&gt;easy_install&lt;/code&gt;) bundled with &lt;code&gt;setuptools&lt;/code&gt; that lets you automatically
download, build, install, and manage Python packages but has a lot of
weak points in front of pip. In order to use pip you first have to
install it by using &lt;em&gt;easy_install&lt;/em&gt;. Why pip is better:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The command is simpler, shorter&lt;/li&gt;
&lt;li&gt;First-class support of virtualenv&lt;/li&gt;
&lt;li&gt;More commands than just &lt;code&gt;install&lt;/code&gt;, including &lt;code&gt;uninstall&lt;/code&gt;.
    &lt;code&gt;pip bundle&lt;/code&gt;, &lt;code&gt;pip freeze&lt;/code&gt; and &lt;code&gt;pip search&lt;/code&gt; are pretty nice as well.&lt;/li&gt;
&lt;li&gt;Can install from a VCS (via &lt;code&gt;-e&lt;/code&gt;), or from source&lt;/li&gt;
&lt;li&gt;Requirements files are easy to use, clearly describes what happens
    in its process&lt;/li&gt;
&lt;li&gt;If it can not download all the dependencies, it will not install
    anything (though I don't think it rolls stuff back if an
    installation fails&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I hope you are as much happy as I am with the acceptance of this PEP. Do
share your views in the comments below and don't forget to share this
post and follow this blog in order to get the latest news relating with
the python world.&lt;/p&gt;</summary>
    <category term="acceptance"/>
    <category term="news"/>
    <category term="PEP"/>
    <category term="pep 453"/>
    <category term="pip"/>
    <category term="python"/>
  </entry>
  <entry>
    <title>PyCharm 3.0 Community Edition</title>
    <link href="http://yasoob.github.io/blog/pycharm-3-0-community-edition" rel="alternate"/>
    <updated>2013-10-22T21:43:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-10-22:pycharm-3-0-community-edition</id>
    <summary type="html">&lt;p&gt;The makers of the hugely popular Python IDE &lt;strong&gt;PyCharm&lt;/strong&gt; recently
announced a community edition of their Python IDE. &lt;strong&gt;JetBrains&lt;/strong&gt;
announced that they will be offering a community Edition of PyCharm
however it will have some stripped down features for example it will not
have builtin support for pyramid etc. However the&lt;!--more--&gt; news for a
Community version of PyCharm became hot in the python community recently
because PyCharm is currently the best IDE available for Python. This
community edition has been out for quite some time now and has already
been downloaded by a lot of developers. Today the Source code of this
IDE was also open sourced by JetBrains. The source code is available on
&lt;a href="https://github.com/JetBrains/intellij-community/"&gt;github&lt;/a&gt; . This IDE has a lot of cool features. Here are a few of the
features of the community version:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Intelligent Editor, with code completion, on-the-fly error
    highlighting, auto-fixes, etc.&lt;/li&gt;
&lt;li&gt;Automated code refactorings and rich navigation capabilities&lt;/li&gt;
&lt;li&gt;Integrated debugger and unit testing support&lt;/li&gt;
&lt;li&gt;Native VCS integrations&lt;/li&gt;
&lt;li&gt;Customizable UI and key-bindings, with VIM&lt;/li&gt;
&lt;li&gt;emulation available&lt;/li&gt;
&lt;li&gt;And much more, all available under the Apache 2 license&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I hope you are as much excited as I am. I have already taken this IDE
for a test drive and have been fascinated by it's power. It is a one
stop solution for every python developer whether he is a system engineer
or a web developer. I hope you will take this IDE for a test drive. Do
share your experience in the comments below so that others can know
about your experience and don't forget to follow this blog if you want
to get latest news, tips, tricks and tutorials relating to python.&lt;/p&gt;</summary>
    <category term="best python ide"/>
    <category term="code writer"/>
    <category term="hot"/>
    <category term="IDE"/>
    <category term="new"/>
    <category term="pycharm"/>
    <category term="python"/>
    <category term="python ide"/>
    <category term="python news"/>
  </entry>
  <entry>
    <title>Python News 13 Oct 2013</title>
    <link href="http://yasoob.github.io/blog/python-news-13-oct-2013" rel="alternate"/>
    <updated>2013-10-14T01:59:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-10-14:python-news-13-oct-2013</id>
    <summary type="html">&lt;p&gt;Hi folks in this post i am going to share with you news from the python
world. This is like a roundup of monthly news.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Latest News&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;1.&lt;/strong&gt; &lt;a href="http://www.theregister.co.uk/2013/10/10/nhs_drops_oracle_for_riak/"&gt;NHS drops Oracle for Python, Riak, Redis, RabbitMQ, Tornado, Flask and more&lt;/a&gt;&lt;br /&gt;
The UK government's quest to get public services&lt;!--more--&gt; to use more
open source technologies seems to be taking hold, judging by the revamp
of the NHS's very large Spine service.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; &lt;a href="http://ipython.org/microsoft-donation-2013.html"&gt;Microsoft donates $100,000 to the IPython team&lt;/a&gt;&lt;br /&gt;
Microsoft donates $100,000 to the IPython team for the continued
development of IPython.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; &lt;a href="http://www.jetbrains.com/pycharm/whatsnew/index.html"&gt;PyCharm 3.0 Community Edition&lt;/a&gt;&lt;br /&gt;
Jet Brains recently surprised the Python community by launching a
community version of it's extremely popular Python IDE. It's a must have
for a Python programmer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; &lt;a href="https://pypi.python.org/pypi/pymongo/2.6.3"&gt;PyMongo 2.6.3 Released&lt;/a&gt;&lt;br /&gt;
MongoDB is one of the leading NoSQL Database. The PyMongo distribution
contains tools for interacting with MongoDB database from Python.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Python Conferences:&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;1.&lt;/strong&gt; &lt;a href="http://pycon.blogspot.ca/2013/10/announcing-keynotes-van-lindberg.html"&gt;PyCon 2014 Keynotes announced&lt;/a&gt;&lt;br /&gt;
The keynote speakers for the largest Python Conference have been
announced. This year the keynote speakers include Van Lindberg, Jessica
McKellar, Fernando Perez, Guido Van Rossum and John Perry Barlow.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; &lt;a href="http://www.pytennessee.org/speaking/cfp/"&gt;PyTennessee Call for Papers!&lt;/a&gt;&lt;br /&gt;
If you are in the Tennessee area and know python then make sure that
you do not miss this great chance to attend the PyTennnesse. Submit your
papers now. The deadline is 1st November.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Articles:&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;1.&lt;/strong&gt; &lt;a href="http://tomforb.es/breaking-out-of-secured-python-environments"&gt;Breaking Out of Secured Python Shells&lt;/a&gt;&lt;br /&gt;
Ever thought of hacking secure python shells ? I hope not but this guy
definitely thought about that and even accomplished. Hop over to his
website to read about his discovery. It is definitely worth a read.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; &lt;a href="http://cbarker.net/blog/projects/applications/cubr"&gt;Cubr!&lt;/a&gt;&lt;br /&gt;
A really cool project. This one involves the use of a mixed up Rubik's
Cube. Just bring the mixed layout of a Rubik's Cube in front of your
webcam and let this nifty application do it's trick.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; &lt;a href="http://wrobstory.github.io/2013/10/mapping-data-python.html"&gt;Mapping data in Python using Pandas and Vincent&lt;/a&gt;&lt;br /&gt;
This Blogpost clearly shows the power of Vincent. Do check it out if
you are into data mining and data representation. This Blogpost will
surely help you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; &lt;a href="http://blog.explainmydata.com/2013/10/training-random-forests-in-python-using.html"&gt;Training Random Forests in Python using the GPU&lt;/a&gt;&lt;br /&gt;
Random Forests have emerged as a very popular learning algorithm for
tackling complex prediction problems. These guys have released GPU
Random Forest library for Python called CudaTree. Check this out if you
want to learn more.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5.&lt;/strong&gt; &lt;a href="http://juliahgrace.com/intro-hardware-hacking-arduino.html"&gt;Introduction to Hardware Hacking with Arduino&lt;/a&gt;&lt;br /&gt;
There are not a lot of post out there which explain clearly how to hack
an Arduino using Python and turning it into a useful creature. This post
is for Hardware Hackers who are a bit familiar with Python.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6.&lt;/strong&gt; &lt;a href="http://www.toptal.com/python/why-are-there-so-many-pythons"&gt;Why are there so many Pythons ?&lt;/a&gt;&lt;br /&gt;
This post starts from scratch and takes you step by step into the world
of different Python implementations. Read it if you have time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7.&lt;/strong&gt; &lt;a href="http://blog.dbrgn.ch/2013/3/26/perceptrons-in-python/"&gt;Programming a Perceptron in Python&lt;/a&gt;&lt;br /&gt;
A perceptron classifier is a simple model of a neuron. In this post the
author programs a Perceptron in Python.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8.&lt;/strong&gt; &lt;a href="http://zulko.github.io/blog/2013/09/27/read-and-write-video-frames-in-python-using-ffmpeg/"&gt;Read and Write Video Frames in Python Using FFMPEG&lt;/a&gt;&lt;br /&gt;
This article shows how easy it is to read or write video frames with
Python, by calling the external software FFMPEG through pipes. Worth the
read if you are interested in video manipulation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Interesting Projects:&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;1.&lt;/strong&gt; &lt;a href="https://pypi.python.org/pypi/csscompressor"&gt;csscompressor -- A python port of YUI CSS Compressor&lt;/a&gt;&lt;br /&gt;
Port of YUI CSS Compressor to Python&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; &lt;a href="http://cintruder.sourceforge.net/"&gt;CIntruder&lt;/a&gt;&lt;br /&gt;
Captcha Intruder is an automatic pentesting tool to bypass captchas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; &lt;a href="https://github.com/crsmithdev/arrow"&gt;Arrow 0.4&lt;/a&gt;&lt;br /&gt;
Better dates &amp;amp; times for Python, now with ISO-8601 parsing and week
support!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; &lt;a href="https://github.com/CamDavidsonPilon/lifelines"&gt;Lifelines&lt;/a&gt;&lt;br /&gt;
Survival analysis in Python.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5.&lt;/strong&gt; &lt;a href="https://github.com/realgam3/pymultitor"&gt;Pymultitor&lt;/a&gt;&lt;br /&gt;
With this algorithm you can use multiple tor threads to make multiple
requests with multiple IP addresses.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6.&lt;/strong&gt; &lt;a href="https://github.com/kennethreitz/flask-sockets"&gt;Flask-Sockets: Easy WebSockets in Flask, by Kenneth Reitz&lt;/a&gt;&lt;br /&gt;
This guy is super nice and always contribute useful libraries. This one
is no less. Check this out if you are working with websockets.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7.&lt;/strong&gt; &lt;a href="http://pythonhosted.org/Whoosh/intro.html"&gt;Whoosh - a fast, pure Python search engine library.&lt;/a&gt;&lt;br /&gt;
Really a wonderful project. Whoosh is a fast, pure Python search engine
library. Whoosh is not really a search engine, it’s a programmer library
for creating a search engine&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8.&lt;/strong&gt; &lt;a href="https://github.com/FZambia/centrifuge"&gt;Centrifuge - real-time messaging in web applications&lt;/a&gt;&lt;br /&gt;
Simple real-time messaging in web applications.The main goal of
Centrifuge is the same as of &lt;a href="http://pusher.com/"&gt;Pusher&lt;/a&gt; or &lt;a href="http://www.pubnub.com/"&gt;Pubnub&lt;/a&gt; services. The main
difference is that Centrifuge is open-source and requires installation.&lt;/p&gt;
&lt;p&gt;I hope you liked this roundup. Make sure that you share this post on
Facebook and Twitter. Stay tuned for the next post! Also do follow my
blog so that you do not miss a single post and finally comment below if
I missed something and if you think that I should do similar posts in
the future as well.&lt;/p&gt;</summary>
    <category term="news"/>
    <category term="python"/>
    <category term="python development"/>
    <category term="python news"/>
    <category term="python projects"/>
    <category term="weekly news"/>
    <category term="weekly newsletter"/>
  </entry>
  <entry>
    <title>All About Decorators in Python</title>
    <link href="http://yasoob.github.io/blog/all-about-decorators-in-python" rel="alternate"/>
    <updated>2013-10-10T21:18:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-10-10:all-about-decorators-in-python</id>
    <summary type="html">&lt;p&gt;Hi there fellas. This is an answer posted on stackoverflow by e-satis.
The original link to the answer is given at the end. No credit goes to
me. All of the credit goes to the original author. This answer is posted
just because most of us are unaware of how decorators work in python and
this answer solves that problem beautifully.&lt;!--more--&gt;&lt;/p&gt;
&lt;h1&gt;Python's functions are objects&lt;/h1&gt;
&lt;p&gt;To understand decorators, you must first understand that functions are
objects in Python.&lt;br /&gt;
This has important consequences. Let's see why with a simple example :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;shout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;yes&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;capitalize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;!&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;shout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# outputs : &amp;#39;Yes!&amp;#39;&lt;/span&gt;

&lt;span class="c1"&gt;# As an object, you can assign the function to a variable like any&lt;/span&gt;
&lt;span class="c1"&gt;# other object&lt;/span&gt;

&lt;span class="n"&gt;scream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;shout&lt;/span&gt;

&lt;span class="c1"&gt;# Notice we don&amp;#39;t use parentheses: we are not calling the function, we are&lt;/span&gt;
&lt;span class="c1"&gt;# putting the function &amp;quot;shout&amp;quot; into the variable &amp;quot;scream&amp;quot;. &lt;/span&gt;
&lt;span class="c1"&gt;# It means you can then call &amp;quot;shout&amp;quot; from &amp;quot;scream&amp;quot;:&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;scream&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# outputs : &amp;#39;Yes!&amp;#39;&lt;/span&gt;

&lt;span class="c1"&gt;# More than that, it means you can remove the old name &amp;#39;shout&amp;#39;, and&lt;/span&gt;
&lt;span class="c1"&gt;# the function will still be accessible from &amp;#39;scream&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;del&lt;/span&gt; &lt;span class="n"&gt;shout&lt;/span&gt;
&lt;span class="n"&gt;try:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;shout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;except&lt;/span&gt; &lt;span class="n"&gt;NameError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
    &lt;span class="c1"&gt;#outputs: &amp;quot;name &amp;#39;shout&amp;#39; is not defined&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;scream&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# outputs: &amp;#39;Yes!&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;OK, keep that in mind, we are going back to it soon. Another interesting
property of Python functions is they can be defined... inside another
function!&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;talk&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;

    &lt;span class="c1"&gt;# You can define a function on the fly in &amp;quot;talk&amp;quot; ...&lt;/span&gt;
    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;whisper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;yes&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;...&amp;quot;&lt;/span&gt;

    &lt;span class="c1"&gt;# ... and use it right away!&lt;/span&gt;

    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;whisper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# You call &amp;quot;talk&amp;quot;, that defines &amp;quot;whisper&amp;quot; EVERY TIME you call it, then&lt;/span&gt;
&lt;span class="c1"&gt;# &amp;quot;whisper&amp;quot; is called in &amp;quot;talk&amp;quot;. &lt;/span&gt;
&lt;span class="n"&gt;talk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# outputs: &lt;/span&gt;
&lt;span class="c1"&gt;# &amp;quot;yes...&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# But &amp;quot;whisper&amp;quot; DOES NOT EXIST outside &amp;quot;talk&amp;quot;:&lt;/span&gt;

&lt;span class="n"&gt;try:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;whisper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;except&lt;/span&gt; &lt;span class="n"&gt;NameError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
    &lt;span class="c1"&gt;#outputs : &amp;quot;name &amp;#39;whisper&amp;#39; is not defined&amp;quot;*&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h1&gt;Functions references&lt;/h1&gt;
&lt;p&gt;OK, still here? Now the fun part, you've seen that functions are objects
and therefore:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;can be assigned to a variable;&lt;/li&gt;
&lt;li&gt;can be defined in another function.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Well, that means that a function can return another function :-) Have a
look:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;getTalk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;shout&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="c1"&gt;# We define functions on the fly&lt;/span&gt;
    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;shout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;yes&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;capitalize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;!&amp;quot;&lt;/span&gt;

    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;whisper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;yes&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;# Then we return one of them&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;shout&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# We don&amp;#39;t use &amp;quot;()&amp;quot;, we are not calling the function,&lt;/span&gt;
        &lt;span class="c1"&gt;# we are returning the function object&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;shout&lt;/span&gt;  
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;whisper&lt;/span&gt;

&lt;span class="c1"&gt;# How do you use this strange beast?&lt;/span&gt;

&lt;span class="c1"&gt;# Get the function and assign it to a variable&lt;/span&gt;
&lt;span class="n"&gt;talk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getTalk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# You can see that &amp;quot;talk&amp;quot; is here a function object:&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;talk&lt;/span&gt;
&lt;span class="c1"&gt;#outputs : &amp;lt;function shout at 0xb7ea817c&amp;gt;&lt;/span&gt;

&lt;span class="c1"&gt;# The object is the one returned by the function:&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;talk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;#outputs : Yes!&lt;/span&gt;

&lt;span class="c1"&gt;# And you can even use it directly if you feel wild:&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;getTalk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;whisper&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)()&lt;/span&gt;
&lt;span class="c1"&gt;#outputs : yes...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;But wait, there is more. If you can return a function, then you can pass
one as a parameter:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;doSomethingBefore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; 
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;I do something before then I call the function you gave me&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;doSomethingBefore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scream&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;#outputs: &lt;/span&gt;
&lt;span class="c1"&gt;#I do something before then I call the function you gave me&lt;/span&gt;
&lt;span class="c1"&gt;#Yes!&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Well, you just have everything needed to understand decorators. You see,
decorators are wrappers which means that &lt;strong&gt;they let you execute code
before and after the function they decorate&lt;/strong&gt; without the need to modify
the function itself.&lt;/p&gt;
&lt;h1&gt;Handcrafted decorators&lt;/h1&gt;
&lt;p&gt;How you would do it manually:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;# A decorator is a function that expects ANOTHER function as parameter&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;my_shiny_new_decorator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a_function_to_decorate&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="c1"&gt;# Inside, the decorator defines a function on the fly: the wrapper.&lt;/span&gt;
    &lt;span class="c1"&gt;# This function is going to be wrapped around the original function&lt;/span&gt;
    &lt;span class="c1"&gt;# so it can execute code before and after it.&lt;/span&gt;
    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;the_wrapper_around_the_original_function&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;

        &lt;span class="c1"&gt;# Put here the code you want to be executed BEFORE the original &lt;/span&gt;
        &lt;span class="c1"&gt;# function is called&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Before the function runs&amp;quot;&lt;/span&gt;

        &lt;span class="c1"&gt;# Call the function here (using parentheses)&lt;/span&gt;
        &lt;span class="n"&gt;a_function_to_decorate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c1"&gt;# Put here the code you want to be executed AFTER the original &lt;/span&gt;
        &lt;span class="c1"&gt;# function is called&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;After the function runs&amp;quot;&lt;/span&gt;

    &lt;span class="c1"&gt;# At this point, &amp;quot;a_function_to_decorate&amp;quot; HAS NEVER BEEN EXECUTED.&lt;/span&gt;
    &lt;span class="c1"&gt;# We return the wrapper function we have just created.&lt;/span&gt;
    &lt;span class="c1"&gt;# The wrapper contains the function and the code to execute before&lt;/span&gt;
    &lt;span class="c1"&gt;# and after. It&amp;#39;s ready to use!&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;the_wrapper_around_the_original_function&lt;/span&gt;

&lt;span class="c1"&gt;# Now imagine you create a function you don&amp;#39;t want to ever touch again.&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;a_stand_alone_function&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;I am a stand alone function, don&amp;#39;t you dare modify me&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;a_stand_alone_function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
&lt;span class="c1"&gt;#outputs: I am a stand alone function, don&amp;#39;t you dare modify me&lt;/span&gt;

&lt;span class="c1"&gt;# Well, you can decorate it to extend its behavior.&lt;/span&gt;
&lt;span class="c1"&gt;# Just pass it to the decorator, it will wrap it dynamically in &lt;/span&gt;
&lt;span class="c1"&gt;# any code you want and return you a new function ready to be used:&lt;/span&gt;

&lt;span class="n"&gt;a_stand_alone_function_decorated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;my_shiny_new_decorator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a_stand_alone_function&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;a_stand_alone_function_decorated&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;#outputs:&lt;/span&gt;
&lt;span class="c1"&gt;#Before the function runs&lt;/span&gt;
&lt;span class="c1"&gt;#I am a stand alone function, don&amp;#39;t you dare modify me&lt;/span&gt;
&lt;span class="c1"&gt;#After the function runs&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now, you probably want that every time you call
&lt;code&gt;a_stand_alone_function&lt;/code&gt;, &lt;code&gt;a_stand_alone_function_decorated&lt;/code&gt; is called
instead. That's easy, just overwrite &lt;code&gt;a_stand_alone_function&lt;/code&gt; with the
function returned by &lt;code&gt;my_shiny_new_decorator&lt;/code&gt;:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;a_stand_alone_function&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;my_shiny_new_decorator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a_stand_alone_function&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;a_stand_alone_function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;#outputs:&lt;/span&gt;
&lt;span class="c1"&gt;#Before the function runs&lt;/span&gt;
&lt;span class="c1"&gt;#I am a stand alone function, don&amp;#39;t you dare modify me&lt;/span&gt;
&lt;span class="c1"&gt;#After the function runs&lt;/span&gt;

&lt;span class="c1"&gt;# And guess what? That&amp;#39;s EXACTLY what decorators do!&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h1&gt;Decorators demystified&lt;/h1&gt;
&lt;p&gt;The previous example, using the decorator syntax:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nv"&gt;@my_shiny_new_decorator&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;another_stand_alone_function&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Leave me alone&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;another_stand_alone_function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  
&lt;span class="c1"&gt;#outputs:  &lt;/span&gt;
&lt;span class="c1"&gt;#Before the function runs&lt;/span&gt;
&lt;span class="c1"&gt;#Leave me alone&lt;/span&gt;
&lt;span class="c1"&gt;#After the function runs&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Yes, that's all, it's that simple. &lt;code&gt;@decorator&lt;/code&gt; is just a shortcut to:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;another_stand_alone_function&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;my_shiny_new_decorator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;another_stand_alone_function&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Decorators are just a pythonic variant of the &lt;a href="http://en.wikipedia.org/wiki/Decorator_pattern"&gt;decorator design
pattern&lt;/a&gt;. There are several classic design patterns embedded in Python
to ease development, like iterators.&lt;/p&gt;
&lt;p&gt;Of course, you can cumulate decorators:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;def bread(func):
    def wrapper():
        print &amp;quot;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;/&amp;#39;&amp;#39;&amp;#39;&amp;#39;&amp;#39;&amp;#39;\&amp;gt;&amp;quot;
        func()
        print &amp;quot;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;\______/&amp;gt;&amp;quot;
    return wrapper

def ingredients(func):
    def wrapper():
        print &amp;quot;#tomatoes#&amp;quot;
        func()
        print &amp;quot;~salad~&amp;quot;
    return wrapper

def sandwich(food=&amp;quot;--ham--&amp;quot;):
    print food

sandwich()
#outputs: --ham--
sandwich = bread(ingredients(sandwich))
sandwich()
#outputs:
#&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;/&amp;#39;&amp;#39;&amp;#39;&amp;#39;&amp;#39;&amp;#39;\&amp;gt;
# #tomatoes#
# --ham--
# ~salad~
#&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;\______/&amp;gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Using the Python decorator syntax:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nv"&gt;@bread&lt;/span&gt;
&lt;span class="nv"&gt;@ingredients&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;sandwich&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;food&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;--ham--&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;food&lt;/span&gt;

&lt;span class="n"&gt;sandwich&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;#outputs:&lt;/span&gt;
&lt;span class="c1"&gt;#&amp;lt;/&amp;#39;&amp;#39;&amp;#39;&amp;#39;&amp;#39;&amp;#39;\&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;# #tomatoes#&lt;/span&gt;
&lt;span class="c1"&gt;# --ham--&lt;/span&gt;
&lt;span class="c1"&gt;# ~salad~&lt;/span&gt;
&lt;span class="c1"&gt;#&amp;lt;\______/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The order you set the decorators MATTERS:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nv"&gt;@ingredients&lt;/span&gt;
&lt;span class="nv"&gt;@bread&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;strange_sandwich&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;food&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;--ham--&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;food&lt;/span&gt;

&lt;span class="n"&gt;strange_sandwich&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;#outputs:&lt;/span&gt;
&lt;span class="c1"&gt;##tomatoes#&lt;/span&gt;
&lt;span class="c1"&gt;#&amp;lt;/&amp;#39;&amp;#39;&amp;#39;&amp;#39;&amp;#39;&amp;#39;\&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;# --ham--&lt;/span&gt;
&lt;span class="c1"&gt;#&amp;lt;\______/&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;# ~salad~&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h1&gt;Eventually answering the question&lt;/h1&gt;
&lt;p&gt;As a conclusion, you can easily see how to answer the question:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;# The decorator to make it bold
def makebold(fn):
    # The new function the decorator returns
    def wrapper():
        # Insertion of some code before and after
        return &amp;quot;&lt;span class="nt"&gt;&amp;lt;b&amp;gt;&lt;/span&gt;&amp;quot; + fn() + &amp;quot;&lt;span class="nt"&gt;&amp;lt;/b&amp;gt;&lt;/span&gt;&amp;quot;
    return wrapper

# The decorator to make it italic
def makeitalic(fn):
    # The new function the decorator returns
    def wrapper():
        # Insertion of some code before and after
        return &amp;quot;&lt;span class="nt"&gt;&amp;lt;i&amp;gt;&lt;/span&gt;&amp;quot; + fn() + &amp;quot;&lt;span class="nt"&gt;&amp;lt;/i&amp;gt;&lt;/span&gt;&amp;quot;
    return wrapper

@makebold
@makeitalic
def say():
    return &amp;quot;hello&amp;quot;

print say() 
#outputs: &lt;span class="nt"&gt;&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;&lt;/span&gt;hello&lt;span class="nt"&gt;&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;&lt;/span&gt;

# This is the exact equivalent to 
def say():
    return &amp;quot;hello&amp;quot;
say = makebold(makeitalic(say))

print say() 
#outputs: &lt;span class="nt"&gt;&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;&lt;/span&gt;hello&lt;span class="nt"&gt;&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You can now just leave happy, or burn your brain a little bit more and
see advanced uses of decorators.&lt;/p&gt;
&lt;h1&gt;Passing arguments to the decorated function&lt;/h1&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;# It&amp;#39;s not black magic, you just have to let the wrapper &lt;/span&gt;
&lt;span class="c1"&gt;# pass the argument:&lt;/span&gt;

&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;a_decorator_passing_arguments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function_to_decorate&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;a_wrapper_accepting_arguments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arg2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;I got args! Look:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arg2&lt;/span&gt;
        &lt;span class="n"&gt;function_to_decorate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arg2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a_wrapper_accepting_arguments&lt;/span&gt;

&lt;span class="c1"&gt;# Since when you are calling the function returned by the decorator, you are&lt;/span&gt;
&lt;span class="c1"&gt;# calling the wrapper, passing arguments to the wrapper will let it pass them to &lt;/span&gt;
&lt;span class="c1"&gt;# the decorated function&lt;/span&gt;

&lt;span class="nv"&gt;@a_decorator_passing_arguments&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;print_full_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last_name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;My name is&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;first_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last_name&lt;/span&gt;

&lt;span class="n"&gt;print_full_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Peter&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Venkman&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# outputs:&lt;/span&gt;
&lt;span class="c1"&gt;#I got args! Look: Peter Venkman&lt;/span&gt;
&lt;span class="c1"&gt;#My name is Peter Venkman&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h1&gt;Decorating methods&lt;/h1&gt;
&lt;p&gt;What's great with Python is that methods and functions are really the
same, except methods expect their first parameter to be a reference to
the current object (&lt;code&gt;self&lt;/code&gt;). It means you can build a decorator for
methods the same way, just remember to take self in consideration:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="s-Atom"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;method_friendly_decorator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s-Atom"&gt;method_to_decorate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s-Atom"&gt;:&lt;/span&gt;
    &lt;span class="s-Atom"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s-Atom"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s-Atom"&gt;lie&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s-Atom"&gt;:&lt;/span&gt;
        &lt;span class="s-Atom"&gt;lie&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s-Atom"&gt;lie&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="s-Atom"&gt;#&lt;/span&gt; &lt;span class="s-Atom"&gt;very&lt;/span&gt; &lt;span class="s-Atom"&gt;friendly&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s-Atom"&gt;decrease&lt;/span&gt; &lt;span class="s-Atom"&gt;age&lt;/span&gt; &lt;span class="s-Atom"&gt;even&lt;/span&gt; &lt;span class="nf"&gt;more&lt;/span&gt; &lt;span class="o"&gt;:-&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="s-Atom"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;method_to_decorate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s-Atom"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s-Atom"&gt;lie&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="s-Atom"&gt;return&lt;/span&gt; &lt;span class="s-Atom"&gt;wrapper&lt;/span&gt;


&lt;span class="s-Atom"&gt;class&lt;/span&gt; &lt;span class="nv"&gt;Lucy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s-Atom"&gt;object&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s-Atom"&gt;:&lt;/span&gt;

    &lt;span class="s-Atom"&gt;def&lt;/span&gt; &lt;span class="k"&gt;__&lt;/span&gt;&lt;span class="nf"&gt;init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s-Atom"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s-Atom"&gt;:&lt;/span&gt;
        &lt;span class="s-Atom"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s-Atom"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;32&lt;/span&gt;

    &lt;span class="s-Atom"&gt;@method_friendly_decorator&lt;/span&gt;
    &lt;span class="s-Atom"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sayYourAge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s-Atom"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s-Atom"&gt;lie&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s-Atom"&gt;:&lt;/span&gt;
        &lt;span class="s-Atom"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;I am %s, what did you think?&amp;quot;&lt;/span&gt; &lt;span class="c1"&gt;% (self.age + lie)&lt;/span&gt;

&lt;span class="s-Atom"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;Lucy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="s-Atom"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sayYourAge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="s-Atom"&gt;#&lt;/span&gt;&lt;span class="nn"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;I&lt;/span&gt; &lt;span class="s-Atom"&gt;am&lt;/span&gt; &lt;span class="m"&gt;26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s-Atom"&gt;what&lt;/span&gt; &lt;span class="s-Atom"&gt;did&lt;/span&gt; &lt;span class="s-Atom"&gt;you&lt;/span&gt; &lt;span class="s-Atom"&gt;think?&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Of course, if you make a very general decorator and want to apply it to
any function or method, no matter its arguments, then just use
&lt;code&gt;*args, **kwargs&lt;/code&gt;:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;a_decorator_passing_arbitrary_arguments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function_to_decorate&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# The wrapper accepts any arguments&lt;/span&gt;
    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;a_wrapper_accepting_arbitrary_arguments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Do I have args?:&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;kwargs&lt;/span&gt;
        &lt;span class="c1"&gt;# Then you unpack the arguments, here *args, **kwargs&lt;/span&gt;
        &lt;span class="c1"&gt;# If you are not familiar with unpacking, check:&lt;/span&gt;
        &lt;span class="c1"&gt;# http://www.saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python/&lt;/span&gt;
        &lt;span class="n"&gt;function_to_decorate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a_wrapper_accepting_arbitrary_arguments&lt;/span&gt;

&lt;span class="nv"&gt;@a_decorator_passing_arbitrary_arguments&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;function_with_no_argument&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Python is cool, no argument here.&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;function_with_no_argument&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;#outputs&lt;/span&gt;
&lt;span class="c1"&gt;#Do I have args?:&lt;/span&gt;
&lt;span class="c1"&gt;#()&lt;/span&gt;
&lt;span class="c1"&gt;#{}&lt;/span&gt;
&lt;span class="c1"&gt;#Python is cool, no argument here.&lt;/span&gt;

&lt;span class="nv"&gt;@a_decorator_passing_arbitrary_arguments&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;function_with_arguments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;

&lt;span class="n"&gt;function_with_arguments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;#outputs&lt;/span&gt;
&lt;span class="c1"&gt;#Do I have args?:&lt;/span&gt;
&lt;span class="c1"&gt;#(1, 2, 3)&lt;/span&gt;
&lt;span class="c1"&gt;#{}&lt;/span&gt;
&lt;span class="c1"&gt;#1 2 3&lt;/span&gt;

&lt;span class="nv"&gt;@a_decorator_passing_arbitrary_arguments&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;function_with_named_arguments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;platypus&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Why not ?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Do %s, %s and %s like platypus? %s&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt;  
   &lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;platypus&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;function_with_named_arguments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Bill&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Linus&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Steve&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;platypus&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Indeed!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;#outputs&lt;/span&gt;
&lt;span class="c1"&gt;#Do I have args ? :&lt;/span&gt;
&lt;span class="c1"&gt;#(&amp;#39;Bill&amp;#39;, &amp;#39;Linus&amp;#39;, &amp;#39;Steve&amp;#39;)&lt;/span&gt;
&lt;span class="c1"&gt;#{&amp;#39;platypus&amp;#39;: &amp;#39;Indeed!&amp;#39;}&lt;/span&gt;
&lt;span class="c1"&gt;#Do Bill, Linus and Steve like platypus? Indeed!&lt;/span&gt;

&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Mary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt;

    &lt;span class="nv"&gt;@a_decorator_passing_arbitrary_arguments&lt;/span&gt;
    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;sayYourAge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lie&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="c1"&gt;# You can now add a default value&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;I am %s, what did you think ?&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt; &lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;lie&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Mary&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sayYourAge&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;#outputs&lt;/span&gt;
&lt;span class="c1"&gt;# Do I have args?:&lt;/span&gt;
&lt;span class="c1"&gt;#(&amp;lt;__main__.Mary object at 0xb7d303ac&amp;gt;,)&lt;/span&gt;
&lt;span class="c1"&gt;#{}&lt;/span&gt;
&lt;span class="c1"&gt;#I am 28, what did you think?&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h1&gt;Passing arguments to the decorator&lt;/h1&gt;
&lt;p&gt;Great, now what would you say about passing arguments to the decorator
itself? Well this is a bit twisted because a decorator must accept a
function as an argument and therefore, you cannot pass the decorated
function arguments directly to the decorator.&lt;/p&gt;
&lt;p&gt;Before rushing to the solution, let's write a little reminder:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="cp"&gt;# Decorators are ORDINARY functions&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;my_decorator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;I am a ordinary function&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;I am function returned by the decorator&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;

&lt;span class="cp"&gt;# Therefore, you can call it without any &amp;quot;@&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;lazy_function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;zzzzzzzz&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;decorated_function&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;my_decorator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lazy_function&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="cp"&gt;#outputs: I am a ordinary function&lt;/span&gt;

&lt;span class="cp"&gt;# It outputs &amp;quot;I am a ordinary function&amp;quot;, because that&amp;#39;s just what you do:&lt;/span&gt;
&lt;span class="cp"&gt;# calling a function. Nothing magic.&lt;/span&gt;

&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;my_decorator&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;lazy_function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;zzzzzzzz&amp;quot;&lt;/span&gt;

&lt;span class="cp"&gt;#outputs: I am a ordinary function&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;It's exactly the same. "&lt;code&gt;my_decorator&lt;/code&gt;" is called. So when you
&lt;code&gt;@my_decorator&lt;/code&gt;, you are telling Python to call the function 'labeled by
the variable "&lt;code&gt;my_decorator&lt;/code&gt;"'. It's important, because the label you
give can point directly to the decorator... or not! Let's start to be
evil!&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;decorator_maker&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;

    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;I make decorators! I am executed only once: &amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;  
         &lt;span class="s"&gt;&amp;quot;when you make me create a decorator.&amp;quot;&lt;/span&gt;

    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;my_decorator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;I am a decorator! I am executed only when you decorate a function.&amp;quot;&lt;/span&gt;

        &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;wrapped&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;I am the wrapper around the decorated function. &amp;quot;&lt;/span&gt;
                  &lt;span class="s"&gt;&amp;quot;I am called when you call the decorated function. &amp;quot;&lt;/span&gt;
                  &lt;span class="s"&gt;&amp;quot;As the wrapper, I return the RESULT of the decorated function.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;As the decorator, I return the wrapped function.&amp;quot;&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapped&lt;/span&gt;

    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;As a decorator maker, I return a decorator&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;my_decorator&lt;/span&gt;

&lt;span class="c1"&gt;# Let&amp;#39;s create a decorator. It&amp;#39;s just a new function after all.&lt;/span&gt;
&lt;span class="n"&gt;new_decorator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;decorator_maker&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;       
&lt;span class="c1"&gt;#outputs:&lt;/span&gt;
&lt;span class="c1"&gt;#I make decorators! I am executed only once: when you make me create a decorator.&lt;/span&gt;
&lt;span class="c1"&gt;#As a decorator maker, I return a decorator&lt;/span&gt;

&lt;span class="c1"&gt;# Then we decorate the function&lt;/span&gt;

&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;decorated_function&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;I am the decorated function.&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;decorated_function&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new_decorator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decorated_function&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;#outputs:&lt;/span&gt;
&lt;span class="c1"&gt;#I am a decorator! I am executed only when you decorate a function.&lt;/span&gt;
&lt;span class="c1"&gt;#As the decorator, I return the wrapped function&lt;/span&gt;

&lt;span class="c1"&gt;# Let&amp;#39;s call the function:&lt;/span&gt;
&lt;span class="n"&gt;decorated_function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;#outputs:&lt;/span&gt;
&lt;span class="c1"&gt;#I am the wrapper around the decorated function. I am called when you call the decorated function.&lt;/span&gt;
&lt;span class="c1"&gt;#As the wrapper, I return the RESULT of the decorated function.&lt;/span&gt;
&lt;span class="c1"&gt;#I am the decorated function.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;No surprise here. Let's do EXACTLY the same thing, but skipping
intermediate variables:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;decorated_function&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;I am the decorated function.&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;decorated_function&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;decorator_maker&lt;/span&gt;&lt;span class="p"&gt;()(&lt;/span&gt;&lt;span class="n"&gt;decorated_function&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;#outputs:&lt;/span&gt;
&lt;span class="c1"&gt;#I make decorators! I am executed only once: when you make me create a decorator.&lt;/span&gt;
&lt;span class="c1"&gt;#As a decorator maker, I return a decorator&lt;/span&gt;
&lt;span class="c1"&gt;#I am a decorator! I am executed only when you decorate a function.&lt;/span&gt;
&lt;span class="c1"&gt;#As the decorator, I return the wrapped function.&lt;/span&gt;

&lt;span class="c1"&gt;# Finally:&lt;/span&gt;
&lt;span class="n"&gt;decorated_function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;    
&lt;span class="c1"&gt;#outputs:&lt;/span&gt;
&lt;span class="c1"&gt;#I am the wrapper around the decorated function. I am called when you call the decorated function.&lt;/span&gt;
&lt;span class="c1"&gt;#As the wrapper, I return the RESULT of the decorated function.&lt;/span&gt;
&lt;span class="c1"&gt;#I am the decorated function.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Let's make it AGAIN, even shorter:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nv"&gt;@decorator_maker&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;decorated_function&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;I am the decorated function.&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;#outputs:&lt;/span&gt;
&lt;span class="c1"&gt;#I make decorators! I am executed only once: when you make me create a decorator.&lt;/span&gt;
&lt;span class="c1"&gt;#As a decorator maker, I return a decorator&lt;/span&gt;
&lt;span class="c1"&gt;#I am a decorator! I am executed only when you decorate a function.&lt;/span&gt;
&lt;span class="c1"&gt;#As the decorator, I return the wrapped function.&lt;/span&gt;

&lt;span class="c1"&gt;#Eventually: &lt;/span&gt;
&lt;span class="n"&gt;decorated_function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;    
&lt;span class="c1"&gt;#outputs:&lt;/span&gt;
&lt;span class="c1"&gt;#I am the wrapper around the decorated function. I am called when you call the decorated function.&lt;/span&gt;
&lt;span class="c1"&gt;#As the wrapper, I return the RESULT of the decorated function.&lt;/span&gt;
&lt;span class="c1"&gt;#I am the decorated function.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Hey, did you see that? We used a function call with the "&lt;code&gt;@&lt;/code&gt;" syntax :-)&lt;/p&gt;
&lt;p&gt;So back to decorators with arguments. If we can use functions to
generate the decorator on the fly, we can pass arguments to that
function, right?&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;decorator_maker_with_arguments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decorator_arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;decorator_arg2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;I make decorators! And I accept arguments:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;decorator_arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;decorator_arg2&lt;/span&gt;

    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;my_decorator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# The ability to pass arguments here is a gift from closures.&lt;/span&gt;
        &lt;span class="c1"&gt;# If you are not comfortable with closures, you can assume it&amp;#39;s ok,&lt;/span&gt;
        &lt;span class="c1"&gt;# or read: http://stackoverflow.com/questions/13857/can-you-explain-closures-as-they-relate-to-python&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;I am the decorator. Somehow you passed me arguments:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;decorator_arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;decorator_arg2&lt;/span&gt;

        &lt;span class="c1"&gt;# Don&amp;#39;t confuse decorator arguments and function arguments!&lt;/span&gt;
        &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;wrapped&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function_arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;function_arg2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;I am the wrapper around the decorated function.\n&amp;quot;&lt;/span&gt;
                  &lt;span class="s"&gt;&amp;quot;I can access all the variables\n&amp;quot;&lt;/span&gt;
                  &lt;span class="s"&gt;&amp;quot;\t- from the decorator: {0} {1}\n&amp;quot;&lt;/span&gt;
                  &lt;span class="s"&gt;&amp;quot;\t- from the function call: {2} {3}\n&amp;quot;&lt;/span&gt;
                  &lt;span class="s"&gt;&amp;quot;Then I can pass them to the decorated function&amp;quot;&lt;/span&gt;
                  &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decorator_arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;decorator_arg2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="n"&gt;function_arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;function_arg2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function_arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;function_arg2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapped&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;my_decorator&lt;/span&gt;

&lt;span class="nv"&gt;@decorator_maker_with_arguments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Leonard&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Sheldon&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;decorated_function_with_arguments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function_arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;function_arg2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;I am the decorated function and only knows about my arguments: {0}&amp;quot;&lt;/span&gt;
           &lt;span class="s"&gt;&amp;quot; {1}&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function_arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;function_arg2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;decorated_function_with_arguments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Rajesh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Howard&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;#outputs:&lt;/span&gt;
&lt;span class="c1"&gt;#I make decorators! And I accept arguments: Leonard Sheldon&lt;/span&gt;
&lt;span class="c1"&gt;#I am the decorator. Somehow you passed me arguments: Leonard Sheldon&lt;/span&gt;
&lt;span class="c1"&gt;#I am the wrapper around the decorated function. &lt;/span&gt;
&lt;span class="c1"&gt;#I can access all the variables &lt;/span&gt;
&lt;span class="c1"&gt;#    - from the decorator: Leonard Sheldon &lt;/span&gt;
&lt;span class="c1"&gt;#    - from the function call: Rajesh Howard &lt;/span&gt;
&lt;span class="c1"&gt;#Then I can pass them to the decorated function&lt;/span&gt;
&lt;span class="c1"&gt;#I am the decorated function and only knows about my arguments: Rajesh Howard&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Here it is, a decorator with arguments. Arguments can be set as
variable:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;c1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Penny&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;c2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Leslie&amp;quot;&lt;/span&gt;

&lt;span class="nv"&gt;@decorator_maker_with_arguments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Leonard&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;decorated_function_with_arguments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function_arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;function_arg2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;I am the decorated function and only knows about my arguments:&amp;quot;&lt;/span&gt;
           &lt;span class="s"&gt;&amp;quot; {0} {1}&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function_arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;function_arg2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;decorated_function_with_arguments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Howard&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;#outputs:&lt;/span&gt;
&lt;span class="c1"&gt;#I make decorators! And I accept arguments: Leonard Penny&lt;/span&gt;
&lt;span class="c1"&gt;#I am the decorator. Somehow you passed me arguments: Leonard Penny&lt;/span&gt;
&lt;span class="c1"&gt;#I am the wrapper around the decorated function. &lt;/span&gt;
&lt;span class="c1"&gt;#I can access all the variables &lt;/span&gt;
&lt;span class="c1"&gt;#    - from the decorator: Leonard Penny &lt;/span&gt;
&lt;span class="c1"&gt;#    - from the function call: Leslie Howard &lt;/span&gt;
&lt;span class="c1"&gt;#Then I can pass them to the decorated function&lt;/span&gt;
&lt;span class="c1"&gt;#I am the decorated function and only knows about my arguments: Leslie Howard&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;As you can see, you can pass arguments to the decorator like any
function using this trick. You can even use &lt;code&gt;*args, **kwargs&lt;/code&gt; if you
wish. But remember decorators are called &lt;strong&gt;only once&lt;/strong&gt;. Just when Python
imports the script. You can't dynamically set the arguments afterwards.
When you do "import x", &lt;strong&gt;the function is already decorated&lt;/strong&gt;, so you
can't&lt;br /&gt;
change anything.&lt;/p&gt;
&lt;h1&gt;Let's practice: a decorator to decorate a decorator&lt;/h1&gt;
&lt;p&gt;OK, as a bonus, I'll give you a snippet to make any decorator accept
generically any argument. After all, in order to accept arguments, we
created our decorator using another function.&lt;br /&gt;
We wrapped the decorator.&lt;br /&gt;
Anything else we saw recently that wrapped function?&lt;br /&gt;
Oh yes, decorators!&lt;br /&gt;
Let's have some fun and write a decorator for the decorators:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;decorator_with_args&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decorator_to_enhance&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;&amp;quot;&amp;quot; &lt;/span&gt;
&lt;span class="s"&gt;    This function is supposed to be used as a decorator.&lt;/span&gt;
&lt;span class="s"&gt;    It must decorate an other function, that is intended to be used as a decorator.&lt;/span&gt;
&lt;span class="s"&gt;    Take a cup of coffee.&lt;/span&gt;
&lt;span class="s"&gt;    It will allow any decorator to accept an arbitrary number of arguments,&lt;/span&gt;
&lt;span class="s"&gt;    saving you the headache to remember how to do that every time.&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

    &lt;span class="c1"&gt;# We use the same trick we did to pass arguments&lt;/span&gt;
    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;decorator_maker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

        &lt;span class="c1"&gt;# We create on the fly a decorator that accepts only a function&lt;/span&gt;
        &lt;span class="c1"&gt;# but keeps the passed arguments from the maker.&lt;/span&gt;
        &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;decorator_wrapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

            &lt;span class="c1"&gt;# We return the result of the original decorator, which, after all, &lt;/span&gt;
            &lt;span class="c1"&gt;# IS JUST AN ORDINARY FUNCTION (which returns a function).&lt;/span&gt;
            &lt;span class="c1"&gt;# Only pitfall: the decorator must have this specific signature or it won&amp;#39;t work:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;decorator_to_enhance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;decorator_wrapper&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;decorator_maker&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;It can be used as follows:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;# You create the function you will use as a decorator. And stick a decorator on it :-)&lt;/span&gt;
&lt;span class="s-Atom"&gt;#&lt;/span&gt; &lt;span class="nv"&gt;Don&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="s-Atom"&gt;t&lt;/span&gt; &lt;span class="s-Atom"&gt;forget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s-Atom"&gt;the&lt;/span&gt; &lt;span class="s-Atom"&gt;signature&lt;/span&gt; &lt;span class="o"&gt;is&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;decorator(func, *args, **kwargs)&amp;quot;&lt;/span&gt;
&lt;span class="s-Atom"&gt;@decorator_with_args&lt;/span&gt; 
&lt;span class="s-Atom"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;decorated_decorator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s-Atom"&gt;func&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="s-Atom"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s-Atom"&gt;**kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s-Atom"&gt;:&lt;/span&gt; 
    &lt;span class="s-Atom"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s-Atom"&gt;function_arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s-Atom"&gt;function_arg2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s-Atom"&gt;:&lt;/span&gt;
        &lt;span class="s-Atom"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Decorated with&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s-Atom"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s-Atom"&gt;kwargs&lt;/span&gt;
        &lt;span class="s-Atom"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s-Atom"&gt;function_arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s-Atom"&gt;function_arg2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="s-Atom"&gt;return&lt;/span&gt; &lt;span class="s-Atom"&gt;wrapper&lt;/span&gt;

&lt;span class="s-Atom"&gt;#&lt;/span&gt; &lt;span class="nv"&gt;Then&lt;/span&gt; &lt;span class="s-Atom"&gt;you&lt;/span&gt; &lt;span class="s-Atom"&gt;decorate&lt;/span&gt; &lt;span class="s-Atom"&gt;the&lt;/span&gt; &lt;span class="s-Atom"&gt;functions&lt;/span&gt; &lt;span class="s-Atom"&gt;you&lt;/span&gt; &lt;span class="s-Atom"&gt;wish&lt;/span&gt; &lt;span class="s-Atom"&gt;with&lt;/span&gt; &lt;span class="s-Atom"&gt;your&lt;/span&gt; &lt;span class="s-Atom"&gt;brand&lt;/span&gt; &lt;span class="s-Atom"&gt;new&lt;/span&gt; &lt;span class="s-Atom"&gt;decorated&lt;/span&gt; &lt;span class="s-Atom"&gt;decorator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="s-Atom"&gt;@&lt;/span&gt;&lt;span class="nf"&gt;decorated_decorator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;404&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="s-Atom"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;decorated_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s-Atom"&gt;function_arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s-Atom"&gt;function_arg2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s-Atom"&gt;:&lt;/span&gt;
    &lt;span class="s-Atom"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Hello&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s-Atom"&gt;function_arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s-Atom"&gt;function_arg2&lt;/span&gt;

&lt;span class="nf"&gt;decorated_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Universe and&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;everything&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="s-Atom"&gt;#&lt;/span&gt;&lt;span class="nn"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="s-Atom"&gt;#&lt;/span&gt;&lt;span class="nv"&gt;Decorated&lt;/span&gt; &lt;span class="nf"&gt;with&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;404&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="s-Atom"&gt;#&lt;/span&gt;&lt;span class="nv"&gt;Hello&lt;/span&gt; &lt;span class="nv"&gt;Universe&lt;/span&gt; &lt;span class="s-Atom"&gt;and&lt;/span&gt; &lt;span class="s-Atom"&gt;everything&lt;/span&gt;

&lt;span class="s-Atom"&gt;#&lt;/span&gt; &lt;span class="nv"&gt;Whoooot&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I know, the last time you had this feeling, it was after listening a guy
saying: "before understanding recursion, you must first understand
recursion". But now, don't you feel good about mastering this?&lt;/p&gt;
&lt;h1&gt;Best practices while using decorators&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;They are new as of Python 2.4, so be sure that's what your code is
    running on.&lt;/li&gt;
&lt;li&gt;Decorators slow down the function call. Keep that in mind.&lt;/li&gt;
&lt;li&gt;You can not un-decorate a function. There are hacks to create
    decorators that can be removed but nobody uses them. So once a
    function is decorated, it's done. &lt;strong&gt;For all the code&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Decorators wrap functions, which can make them hard to debug.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Python 2.5 solves this last issue by providing the &lt;code&gt;functools&lt;/code&gt; module
including &lt;code&gt;functools.wraps&lt;/code&gt; that copies the name, module and docstring
of any wrapped function to it's wrapper. Fun fact, &lt;code&gt;functools.wraps&lt;/code&gt; is
a decorator :-)&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;# For debugging, the stacktrace prints you the function __name__&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;
&lt;span class="c1"&gt;#outputs: foo&lt;/span&gt;

&lt;span class="c1"&gt;# With a decorator, it gets messy    &lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;bar&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;

&lt;span class="nv"&gt;@bar&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;
&lt;span class="c1"&gt;#outputs: wrapper&lt;/span&gt;

&lt;span class="c1"&gt;# &amp;quot;functools&amp;quot; can help for that&lt;/span&gt;

&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;functools&lt;/span&gt;

&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# We say that &amp;quot;wrapper&amp;quot;, is wrapping &amp;quot;func&amp;quot;&lt;/span&gt;
    &lt;span class="c1"&gt;# and the magic begins&lt;/span&gt;
    &lt;span class="nv"&gt;@functools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wraps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;bar&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;

&lt;span class="nv"&gt;@bar&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;
&lt;span class="c1"&gt;#outputs: foo&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h1&gt;How can the decorators be useful?&lt;/h1&gt;
&lt;p&gt;Now the big question: what can I use decorators for? Seem cool and
powerful, but a practical example would be great. Well, there are 1000
possibilities. Classic uses are extending a function behavior from an
external lib (you can't modify it) or for a debug purpose (you don't
want to modify it because it's temporary). You can use them to extends
several functions with the same code without rewriting it every time,
for DRY's sake. E.g.:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;benchmark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;    A decorator that prints the time a function takes&lt;/span&gt;
&lt;span class="s"&gt;    to execute.&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt;
    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;


&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;    A decorator that logs the activity of the script.&lt;/span&gt;
&lt;span class="s"&gt;    (it actually just prints it, but it could be logging!)&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kwargs&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;


&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;    A decorator that counts and prints the number of times a function has been executed&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;wrapper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;{0} has been used: {1}x&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;
    &lt;span class="n"&gt;wrapper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;

&lt;span class="nv"&gt;@counter&lt;/span&gt;
&lt;span class="nv"&gt;@benchmark&lt;/span&gt;
&lt;span class="nv"&gt;@logging&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;reverse_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reversed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;reverse_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Able was I ere I saw Elba&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;reverse_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;A man, a plan, a canoe, pasta, heros, rajahs, a coloratura, maps, snipe, percale, macaroni, a gag, a banana bag, a tan, a tag, a banana bag again (or a camel), a crepe, pins, Spam, a rut, a Rolo, cash, a jar, sore hats, a peon, a canal: Panama!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;#outputs:&lt;/span&gt;
&lt;span class="c1"&gt;#reverse_string (&amp;#39;Able was I ere I saw Elba&amp;#39;,) {}&lt;/span&gt;
&lt;span class="c1"&gt;#wrapper 0.0&lt;/span&gt;
&lt;span class="c1"&gt;#wrapper has been used: 1x &lt;/span&gt;
&lt;span class="c1"&gt;#ablE was I ere I saw elbA&lt;/span&gt;
&lt;span class="c1"&gt;#reverse_string (&amp;#39;A man, a plan, a canoe, pasta, heros, rajahs, a coloratura, maps, snipe, percale, macaroni, a gag, a banana bag, a tan, a tag, a banana bag again (or a camel), a crepe, pins, Spam, a rut, a Rolo, cash, a jar, sore hats, a peon, a canal: Panama!&amp;#39;,) {}&lt;/span&gt;
&lt;span class="c1"&gt;#wrapper 0.0&lt;/span&gt;
&lt;span class="c1"&gt;#wrapper has been used: 2x&lt;/span&gt;
&lt;span class="c1"&gt;#!amanaP :lanac a ,noep a ,stah eros ,raj a ,hsac ,oloR a ,tur a ,mapS ,snip ,eperc a ,)lemac a ro( niaga gab ananab a ,gat a ,nat a ,gab ananab a ,gag a ,inoracam ,elacrep ,epins ,spam ,arutaroloc a ,shajar ,soreh ,atsap ,eonac a ,nalp a ,nam A&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Of course the good thing with decorators is that you can use them right
away on almost anything without rewriting. DRY, I said:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nv"&gt;@counter&lt;/span&gt;
&lt;span class="nv"&gt;@benchmark&lt;/span&gt;
&lt;span class="nv"&gt;@logging&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;get_random_futurama_quote&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;httplib&lt;/span&gt;
    &lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;httplib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HTTPConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;slashdot.org:80&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;HEAD&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;/index.html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getresponse&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getheaders&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;x-b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;x-f&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;No, I&amp;#39;m ... doesn&amp;#39;t!&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;get_random_futurama_quote&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;get_random_futurama_quote&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;#outputs:&lt;/span&gt;
&lt;span class="c1"&gt;#get_random_futurama_quote () {}&lt;/span&gt;
&lt;span class="c1"&gt;#wrapper 0.02&lt;/span&gt;
&lt;span class="c1"&gt;#wrapper has been used: 1x&lt;/span&gt;
&lt;span class="c1"&gt;#The laws of science be a harsh mistress.&lt;/span&gt;
&lt;span class="c1"&gt;#get_random_futurama_quote () {}&lt;/span&gt;
&lt;span class="c1"&gt;#wrapper 0.01&lt;/span&gt;
&lt;span class="c1"&gt;#wrapper has been used: 2x&lt;/span&gt;
&lt;span class="c1"&gt;#Curse you, merciful Poseidon!&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Python itself provides several decorators: &lt;code&gt;property&lt;/code&gt;, &lt;code&gt;staticmethod&lt;/code&gt;,
etc. Django use decorators to manage caching and view permissions.
Twisted to fake inlining asynchronous functions calls. This really is a
large playground.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="http://stackoverflow.com/questions/739654/how-can-i-make-a-chain-of-function-decorators-in-python#1594484"&gt;Stackoverflow&lt;/a&gt;&lt;/p&gt;</summary>
    <category term="decorators"/>
    <category term="decorators demystified"/>
    <category term="python"/>
    <category term="python decorators"/>
    <category term="using python decorators"/>
  </entry>
  <entry>
    <title>The Python yield keyword explained</title>
    <link href="http://yasoob.github.io/blog/the-python-yield-keyword-explained" rel="alternate"/>
    <updated>2013-09-29T21:34:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-09-29:the-python-yield-keyword-explained</id>
    <summary type="html">&lt;p&gt;Hi there folks. Again welcome to yet another useful tutorial. This is
again a stackoverflow answer. This one is related to the Python yield
keyword. It explains you what yield, generators and iterables are. So
without wasting any time lets continue with the answer.&lt;/p&gt;
&lt;p&gt;To understand what &lt;code&gt;yield&lt;/code&gt; does,&lt;!--more--&gt; you must understand what
generators are. And before generators come iterables.&lt;/p&gt;
&lt;h2&gt;Iterables&lt;/h2&gt;
&lt;p&gt;When you create a list, you can read its items one by one, and it's
called iteration:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;mylist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;mylist:&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Mylist is an iterable. When you use a list comprehension, you create a
list, and so an iterable:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;mylist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;mylist:&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="mi"&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Everything you can use "for... in..." on is an iterable: lists, strings,
files...&lt;br /&gt;
These iterables are handy because you can read them as much as you
wish, but you store all the values in memory and it's not always what
you want when you have a lot of values.&lt;/p&gt;
&lt;h2&gt;Generators&lt;/h2&gt;
&lt;p&gt;Generators are iterators, but &lt;strong&gt;you can only iterate over them once&lt;/strong&gt;.
It's because they do not store all the values in memory, &lt;strong&gt;they generate
the values on the fly&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;mygenerator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;mygenerator:&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="mi"&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;It is just the same except you used &lt;code&gt;()&lt;/code&gt; instead of &lt;code&gt;[]&lt;/code&gt;. BUT, you can
not perform &lt;code&gt;for i in mygenerator&lt;/code&gt; a second time since generators can
only be used once: they calculate 0, then forget about it and calculate
1, and end calculating 4, one by one.&lt;/p&gt;
&lt;h2&gt;Yield&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Yield&lt;/code&gt; is a keyword that is used like &lt;code&gt;return&lt;/code&gt;, except the function
will return a generator.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;createGenerator&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;    &lt;span class="n"&gt;mylist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;mylist:&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;        &lt;span class="n"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;mygenerator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;createGenerator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# create a generator&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mygenerator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# mygenerator is an object!&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;generator&lt;/span&gt; &lt;span class="n"&gt;object&lt;/span&gt; &lt;span class="n"&gt;createGenerator&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mh"&gt;0xb7555c34&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;mygenerator:&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;     &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="mi"&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Here it's a useless example, but it's handy when you know your function
will return a huge set of values that you will only need to read once.&lt;/p&gt;
&lt;p&gt;To master &lt;code&gt;yield&lt;/code&gt;, you must understand that &lt;strong&gt;when you call the
function, the code you have written in the function body does not run.&lt;/strong&gt;
The function only returns the generator object, this is a bit tricky :-)&lt;/p&gt;
&lt;p&gt;Then, your code will be run each time the &lt;code&gt;for&lt;/code&gt; uses the generator.&lt;/p&gt;
&lt;p&gt;Now the hard part:&lt;/p&gt;
&lt;p&gt;The first time the &lt;code&gt;for&lt;/code&gt; calls the generator object created from your
function, it will run the code in your function from the beginning until
it hits &lt;code&gt;yield&lt;/code&gt;, then it'll return the first value of the loop. Then,
each other call will run the loop you have written in the function one
more time, and return the next value, until there is no value to return.&lt;/p&gt;
&lt;p&gt;The generator is considered empty once the function runs but does not
hit yield anymore. It can be because the loop had come to an end, or
because you do not satisfy a "if/else" anymore.&lt;/p&gt;
&lt;h2&gt;Your code explained&lt;/h2&gt;
&lt;p&gt;Generator:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;# Here you create the method of the node object that will return the generator&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_get_child_candidates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;min_dist&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_dist&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

  &lt;span class="c1"&gt;# Here is the code that will be called each time you use the generator object:&lt;/span&gt;

  &lt;span class="c1"&gt;# If there is still a child of the node object on its left&lt;/span&gt;
  &lt;span class="c1"&gt;# AND if distance is ok, return the next child&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_leftchild&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;max_dist&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_median:&lt;/span&gt;
                &lt;span class="n"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_leftchild&lt;/span&gt;

  &lt;span class="c1"&gt;# If there is still a child of the node object on its right&lt;/span&gt;
  &lt;span class="c1"&gt;# AND if distance is ok, return the next child&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_rightchild&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;max_dist&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_median:&lt;/span&gt;
                &lt;span class="n"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_rightchild&lt;/span&gt;

  &lt;span class="c1"&gt;# If the function arrives here, the generator will be considered empty&lt;/span&gt;
  &lt;span class="c1"&gt;# there is no more than two values: the left and the right children&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Caller:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;# Create an empty list and a list with the current object reference&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;candidates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Loop on candidates (they contain only one element at the beginning)&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;candidates:&lt;/span&gt;

    &lt;span class="c1"&gt;# Get the last candidate and remove it from the list&lt;/span&gt;
    &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;candidates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Get the distance between obj and the candidate&lt;/span&gt;
    &lt;span class="n"&gt;distance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_get_dist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# If distance is ok, then you can fill the result&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;max_dist&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;min_dist:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Add the children of the candidate in the candidates list&lt;/span&gt;
    &lt;span class="c1"&gt;# so the loop will keep running until it will have looked&lt;/span&gt;
    &lt;span class="c1"&gt;# at all the children of the children of the children, etc. of the candidate&lt;/span&gt;
    &lt;span class="n"&gt;candidates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_get_child_candidates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;distance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;min_dist&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_dist&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This code contains several smart parts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The loop iterates on a list but the list expands while the loop is
    being iterated :-) It's a concise way to go through all these nested
    data even if it's a bit dangerous since you can end up with an
    infinite loop. In this case,
    &lt;code&gt;candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))&lt;/code&gt;
    exhausts all the values of the generator, but &lt;code&gt;while&lt;/code&gt; keeps creating
    new generator objects which will produce different values from the
    previous ones since it's not applied on the same node.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;code&gt;extend()&lt;/code&gt; method is a list object method that expects an
    iterable and adds its values to the list.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Usually we pass a list to it:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;But in your code it gets a generator, which is good because:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You don't need to read the values twice.&lt;/li&gt;
&lt;li&gt;You can have a lot of children and you don't want them all stored in
    memory.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And it works because Python does not care if the argument of a method is
a list or not. Python expects iterables so it will work with strings,
lists, tuples and generators! This is called duck typing and is one of
the reason why Python is so cool. But this is another story, for another
question...&lt;/p&gt;
&lt;p&gt;You can stop here, or read a little bit to see a advanced use of
generator:&lt;/p&gt;
&lt;h2&gt;Controlling a generator exhaustion&lt;/h2&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Bank&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="c1"&gt;# let&amp;#39;s create a bank, building ATMs&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;    &lt;span class="n"&gt;crisis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;False&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;create_atm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;crisis:&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;            &lt;span class="n"&gt;yield&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;$100&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;hsbc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Bank&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# when everything&amp;#39;s ok the ATM gives you as much as you want&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;corner_street_atm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hsbc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_atm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;corner_street_atm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;next&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="nv"&gt;$100&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;corner_street_atm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;next&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="nv"&gt;$100&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;corner_street_atm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;cash&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;$100&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;$100&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;$100&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;$100&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;$100&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;hsbc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;crisis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;True&lt;/span&gt; &lt;span class="c1"&gt;# crisis is coming, no more money!&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;corner_street_atm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;next&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;exceptions.StopIteration&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;wall_street_atm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hsbc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_atm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# it&amp;#39;s even true for new ATMs&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wall_street_atm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;next&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;exceptions.StopIteration&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;hsbc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;crisis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;False&lt;/span&gt; &lt;span class="c1"&gt;# trouble is, even post-crisis the ATM remains empty&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;corner_street_atm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;next&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;exceptions.StopIteration&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;brand_new_atm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hsbc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_atm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# build a new one to get back in business&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;cash&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;brand_new_atm:&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;cash&lt;/span&gt;
&lt;span class="nv"&gt;$100&lt;/span&gt;
&lt;span class="nv"&gt;$100&lt;/span&gt;
&lt;span class="nv"&gt;$100&lt;/span&gt;
&lt;span class="nv"&gt;$100&lt;/span&gt;
&lt;span class="nv"&gt;$100&lt;/span&gt;
&lt;span class="nv"&gt;$100&lt;/span&gt;
&lt;span class="nv"&gt;$100&lt;/span&gt;
&lt;span class="nv"&gt;$100&lt;/span&gt;
&lt;span class="nv"&gt;$100&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;It can be useful for various things like controlling access to a
resource.&lt;/p&gt;
&lt;h2&gt;Itertools, your best friend&lt;/h2&gt;
&lt;p&gt;The itertools module contains special functions to manipulate iterables.
Ever wish to duplicate a generator?&lt;br /&gt;
Chain two generators? Group values in a nested list with a one liner?
Map / Zip without creating another list?&lt;/p&gt;
&lt;p&gt;Then just &lt;code&gt;import itertools&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;An example? Let's see the possible orders of arrival for a 4 horse race:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;horses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;races&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;itertools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;permutations&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;horses&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;races&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;itertools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;permutations&lt;/span&gt; &lt;span class="n"&gt;object&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mh"&gt;0xb754f1dc&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;itertools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;permutations&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;horses&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2&gt;Understanding the inner mechanisms of iteration&lt;/h2&gt;
&lt;p&gt;Iteration is a process implying iterables (implementing the &lt;code&gt;__iter__()&lt;/code&gt;
method) and iterators (implementing the &lt;code&gt;__next__()&lt;/code&gt; method).&lt;br /&gt;
Iterables are any objects you can get an iterator from. Iterators are
objects that let you iterate on iterables.&lt;/p&gt;
&lt;p&gt;More about it in this article about &lt;a href="http://effbot.org/zone/python-for-statement.htm"&gt;how does the for loop work&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;source = &lt;a href="http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained"&gt;Stackoverflow question&lt;/a&gt;&lt;/p&gt;</summary>
    <category term="beginner friendly"/>
    <category term="easy tutorial"/>
    <category term="explained"/>
    <category term="generators"/>
    <category term="iterables"/>
    <category term="keyword"/>
    <category term="python"/>
    <category term="yield"/>
  </entry>
  <entry>
    <title>Python Quick Reference v2.7</title>
    <link href="http://yasoob.github.io/blog/python-quick-ref-v2-7" rel="alternate"/>
    <updated>2013-09-26T19:24:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-09-26:python-quick-ref-v2-7</id>
    <summary type="html">&lt;p&gt;Hi there everyone. We all have experienced that time when we say "what
was that function called ?", "was it called get_attr() or post_attr()
?" Recently I came across a wonderful Python Quick Reference for version
2.7 . It contains some useful information. I hope you will find it
very&lt;!--more--&gt; useful just like me. So here is the link. Go forward and
get it. You will not regret it. Do tell me in the comments that whether
you like it or not or do you want something to be added to it. I would
really love to hear your response. Let me make it clear as well that I
am not the author of this great reference guide.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://freepythontips.files.wordpress.com/2013/09/pqr2-7_printing_a4.pdf"&gt;Download Python Quick Reference v2.7&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;source: &lt;a href="http://rgruet.free.fr/#QuickRef"&gt;Python Quick Ref&lt;/a&gt;&lt;/p&gt;</summary>
    <category term="document"/>
    <category term="PQR"/>
    <category term="python"/>
    <category term="python help"/>
    <category term="python quick reference"/>
    <category term="python tutorial"/>
    <category term="reference"/>
    <category term="tutorial"/>
    <category term="v2.7"/>
  </entry>
  <entry>
    <title>All about the metaclasses in Python!</title>
    <link href="http://yasoob.github.io/blog/all-about-the-metaclasses-in-python" rel="alternate"/>
    <updated>2013-09-20T19:41:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-09-20:all-about-the-metaclasses-in-python</id>
    <summary type="html">&lt;p&gt;Hi there pythonistas. Recently I was searching about metaclasses in
Python and came across a very good explanation about metaclasses on
stackoverflow. I found the answer really helpful so I think you should
read it as well. Who knows when you might find something useful in
there.&lt;!--more--&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer: very long post.&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;Classes as objects&lt;/h1&gt;
&lt;p&gt;Before understanding metaclasses, you need to master classes in Python.
And Python has a very peculiar idea of what classes are, borrowed from
the Smalltalk language.&lt;/p&gt;
&lt;p&gt;In most languages, classes are just pieces of code that describe how to
produce an object. That's kinda true in Python too:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;ObjectCreator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;       &lt;span class="n"&gt;pass&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;

  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;my_object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ObjectCreator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;my_object&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;__main__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ObjectCreator&lt;/span&gt; &lt;span class="n"&gt;object&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mh"&gt;0x8974f2c&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;But classes are more than that in Python. Classes are objects too.&lt;/p&gt;
&lt;p&gt;Yes, objects.&lt;/p&gt;
&lt;p&gt;As soon as you use the keyword &lt;code&gt;class&lt;/code&gt;, Python executes it and creates
an OBJECT. The instruction&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;ObjectCreator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;       &lt;span class="n"&gt;pass&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;creates in memory an object with the name ObjectCreator.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This object (the class) is itself capable of creating objects (the
instances), and this is why it's a class&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;But still, it's an object, and therefore:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;you can assign it to a variable&lt;/li&gt;
&lt;li&gt;you can copy it&lt;/li&gt;
&lt;li&gt;you can add attributes to it&lt;/li&gt;
&lt;li&gt;you can pass it as a function parameter&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;e.g.:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ObjectCreator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# you can print a class because it&amp;#39;s an object&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__main__.ObjectCreator&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;echo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;       &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt; 
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;echo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ObjectCreator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# you can pass a class as a parameter&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__main__.ObjectCreator&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ObjectCreator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;new_attribute&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="n"&gt;False&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ObjectCreator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_attribute&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;foo&amp;#39;&lt;/span&gt; &lt;span class="c1"&gt;# you can add attributes to a class&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ObjectCreator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;new_attribute&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="n"&gt;True&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ObjectCreator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_attribute&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;foo&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ObjectCreatorMirror&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ObjectCreator&lt;/span&gt; &lt;span class="c1"&gt;# you can assign a class to a variable&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ObjectCreatorMirror&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_attribute&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;foo&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ObjectCreatorMirror&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;__main__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ObjectCreator&lt;/span&gt; &lt;span class="n"&gt;object&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mh"&gt;0x8997b4c&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h1&gt;Creating classes dynamically&lt;/h1&gt;
&lt;p&gt;Since classes are objects, you can create them on the fly, like any
object.&lt;/p&gt;
&lt;p&gt;First, you can create a class in a function using &lt;code&gt;class&lt;/code&gt;:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;choose_class&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;     &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;foo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;         &lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;             &lt;span class="n"&gt;pass&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;         &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Foo&lt;/span&gt; &lt;span class="c1"&gt;# return the class, not an instance&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;     &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;         &lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Bar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;             &lt;span class="n"&gt;pass&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;         &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Bar&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;     
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;MyClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;choose_class&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;foo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# the function returns a class, not an instance&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__main__.Foo&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# you can create an object from this class&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;__main__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Foo&lt;/span&gt; &lt;span class="n"&gt;object&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mh"&gt;0x89c6d4c&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;But it's not so dynamic, since you still have to write the whole class
yourself.&lt;/p&gt;
&lt;p&gt;Since classes are objects, they must be generated by something.&lt;/p&gt;
&lt;p&gt;When you use the &lt;code&gt;class&lt;/code&gt; keyword, Python creates this object
automatically. But as with most things in Python, it gives you a way to
do it manually.&lt;/p&gt;
&lt;p&gt;Remember the function &lt;code&gt;type&lt;/code&gt;? The good old function that lets you know
what type an object is:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;int&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;str&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ObjectCreator&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;type&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ObjectCreator&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__main__.ObjectCreator&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Well, &lt;code&gt;type&lt;/code&gt; has a completely different ability, it can also create
classes on the fly. &lt;code&gt;type&lt;/code&gt; can take the description of a class as
parameters, and return a class.&lt;/p&gt;
&lt;p&gt;(I know, it's silly that the same function can have two completely
different uses&lt;br /&gt;
according to the parameters you pass to it. It's an issue due to
backwards compatibility in Python)&lt;/p&gt;
&lt;p&gt;&lt;code&gt;type&lt;/code&gt; works this way:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;  &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
       &lt;span class="n"&gt;tuple&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;inheritance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
       &lt;span class="n"&gt;dictionary&lt;/span&gt; &lt;span class="n"&gt;containing&lt;/span&gt; &lt;span class="n"&gt;attributes&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nb"&gt;values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;e.g.:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;MyShinyClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;       &lt;span class="n"&gt;pass&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;can be created manually this way:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;MyShinyClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyShinyClass&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt; &lt;span class="c1"&gt;# returns a class object&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MyShinyClass&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__main__.MyShinyClass&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MyShinyClass&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;# create an instance with the class&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;__main__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MyShinyClass&lt;/span&gt; &lt;span class="n"&gt;object&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mh"&gt;0x8997cec&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You'll notice that we use "MyShinyClass" as the name of the class and as
the variable to hold the class reference. They can be different, but
there is no reason to complicate things.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;type&lt;/code&gt; accepts a dictionary to define the attributes of the class. So:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;       &lt;span class="n"&gt;bar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;True&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Can be translated to:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Foo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Foo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;bar&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;True&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And used as a normal class:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__main__.Foo&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;True&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;__main__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Foo&lt;/span&gt; &lt;span class="n"&gt;object&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mh"&gt;0x8a9b84c&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;True&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And of course, you can inherit from it, so:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;   &lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;FooChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;         &lt;span class="n"&gt;pass&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;would be:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;FooChild&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;FooChild&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;,),&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FooChild&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__main__.FooChild&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FooChild&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# bar is inherited from Foo&lt;/span&gt;
  &lt;span class="n"&gt;True&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Eventually you'll want to add methods to your class. Just define a
function&lt;br /&gt;
with the proper signature and assign it as an attribute.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;echo_bar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;       &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt; 
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;FooChild&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;FooChild&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;,),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;echo_bar&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;echo_bar&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;echo_bar&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;False&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FooChild&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;echo_bar&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;True&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;my_foo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FooChild&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;my_foo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;echo_bar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;True&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You see where we are going: in Python, classes are objects, and you can
create a class on the fly, dynamically.&lt;/p&gt;
&lt;p&gt;This is what Python does when you use the keyword &lt;code&gt;class&lt;/code&gt;, and it does
so by using a metaclass.&lt;/p&gt;
&lt;h1&gt;What are metaclasses (finally)&lt;/h1&gt;
&lt;p&gt;Metaclasses are the 'stuff' that creates classes.&lt;/p&gt;
&lt;p&gt;You define classes in order to create objects, right?&lt;/p&gt;
&lt;p&gt;But we learned that Python classes are objects.&lt;/p&gt;
&lt;p&gt;Well, metaclasses are what create these objects. They are the classes'
classes,&lt;br /&gt;
you can picture them this way:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;  &lt;span class="n"&gt;MyClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MetaClass&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;MyObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You've seen that &lt;code&gt;type&lt;/code&gt; lets you do something like this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;  &lt;span class="n"&gt;MyClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;MyClass&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;It's because the function &lt;code&gt;type&lt;/code&gt; is in fact a metaclass. &lt;code&gt;type&lt;/code&gt; is the
metaclass Python uses to create all classes behind the scenes.&lt;/p&gt;
&lt;p&gt;Now you wonder why the heck is it written in lowercase, and not &lt;code&gt;Type&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;Well, I guess it's a matter of consistency with &lt;code&gt;str&lt;/code&gt;, the class that
creates strings objects, and &lt;code&gt;int&lt;/code&gt; the class that creates integer
objects. &lt;code&gt;type&lt;/code&gt; is just the class that creates class objects.&lt;/p&gt;
&lt;p&gt;You see that by checking the &lt;code&gt;__class__&lt;/code&gt; attribute.&lt;/p&gt;
&lt;p&gt;Everything, and I mean everything, is an object in Python. That includes
ints, strings, functions and classes. All of them are objects. And all
of them have been created from a class:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__class__&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;int&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;bob&amp;#39;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__class__&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;str&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="n"&gt;pass&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__class__&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;function&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Bar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;pass&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Bar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__class__&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__main__.Bar&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now, what is the &lt;code&gt;__class__&lt;/code&gt; of any &lt;code&gt;__class__&lt;/code&gt; ?&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__class__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__class__&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;type&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__class__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__class__&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;type&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__class__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__class__&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;type&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__class__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__class__&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;type&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So, a metaclass is just the stuff that creates class objects.&lt;/p&gt;
&lt;p&gt;You can call it a 'class factory' if you wish.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;type&lt;/code&gt; is the built-in metaclass Python uses, but of course, you can
create your own metaclass.&lt;/p&gt;
&lt;h1&gt;The &lt;code&gt;__metaclass__&lt;/code&gt; attribute&lt;/h1&gt;
&lt;p&gt;You can add a &lt;code&gt;__metaclass__&lt;/code&gt; attribute when you write a class:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;__metaclass__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;something&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If you do so, Python will use the metaclass to create the class &lt;code&gt;Foo&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Careful, it's tricky.&lt;/p&gt;
&lt;p&gt;You write &lt;code&gt;class Foo(object)&lt;/code&gt; first, but the class object &lt;code&gt;Foo&lt;/code&gt; is not
created in memory yet.&lt;/p&gt;
&lt;p&gt;Python will look for &lt;code&gt;__metaclass__&lt;/code&gt; in the class definition. If it
finds it, it will use it to create the object class &lt;code&gt;Foo&lt;/code&gt;. If it
doesn't, it will use &lt;code&gt;type&lt;/code&gt; to create the class.&lt;/p&gt;
&lt;p&gt;Read that several times.&lt;/p&gt;
&lt;p&gt;When you do:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Bar&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;pass&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Python does the following:&lt;/p&gt;
&lt;p&gt;Is there a &lt;code&gt;__metaclass__&lt;/code&gt; attribute in &lt;code&gt;Foo&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;If yes, create in memory a class object (I said a class object, stay
with me here), with the name &lt;code&gt;Foo&lt;/code&gt; by using what is in &lt;code&gt;__metaclass__&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If Python can't find &lt;code&gt;__metaclass__&lt;/code&gt;, it will look for a &lt;code&gt;__metaclass__&lt;/code&gt;
in Bar (the parent class), and try to do the same.&lt;/p&gt;
&lt;p&gt;If Python can't find &lt;code&gt;__metaclass__&lt;/code&gt; in any parent, it will look for&lt;br /&gt;
a &lt;code&gt;__metaclass__&lt;/code&gt; at the MODULE level, and try to do the same.&lt;/p&gt;
&lt;p&gt;Then if it can't find any &lt;code&gt;__metaclass__&lt;/code&gt; at all, it will use &lt;code&gt;type&lt;/code&gt; to
create the class object.&lt;/p&gt;
&lt;p&gt;Now the big question is, what can you put in &lt;code&gt;__metaclass__&lt;/code&gt; ?&lt;/p&gt;
&lt;p&gt;The answer is: something that can create a class.&lt;/p&gt;
&lt;p&gt;And what can create a class? &lt;code&gt;type&lt;/code&gt;, or anything that subclasses or uses
it.&lt;/p&gt;
&lt;h1&gt;Custom metaclasses&lt;/h1&gt;
&lt;p&gt;The main purpose of a metaclass is to change the class automatically,
when it's created.&lt;/p&gt;
&lt;p&gt;You usually do this for APIs, where you want to create classes matching
the current context.&lt;/p&gt;
&lt;p&gt;Imagine a stupid example, where you decide that all classes in your
module should have their attributes written in uppercase. There are
several ways to do this, but one way is to set &lt;code&gt;__metaclass__&lt;/code&gt; at the
module level.&lt;/p&gt;
&lt;p&gt;This way, all classes of this module will be created using this
metaclass, and we just have to tell the metaclass to turn all attributes
to uppercase.&lt;/p&gt;
&lt;p&gt;Luckily, &lt;code&gt;__metaclass__&lt;/code&gt; can actually be any callable, it doesn't need
to be a formal class (I know, something with 'class' in its name doesn't
need to be a class, go figure... but it's helpful).&lt;/p&gt;
&lt;p&gt;So we will start with a simple example, by using a function.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;# the metaclass will automatically get passed the same argument&lt;/span&gt;
&lt;span class="c1"&gt;# that you usually pass to `type`&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;upper_attr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;future_class_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;future_class_parents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;future_class_attr&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="s"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;    Return a class object, with the list of its attribute turned &lt;/span&gt;
&lt;span class="s"&gt;    into uppercase.&lt;/span&gt;
&lt;span class="s"&gt;  &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

  &lt;span class="c1"&gt;# pick up any attribute that doesn&amp;#39;t start with &amp;#39;__&amp;#39; and uppercase it&lt;/span&gt;
  &lt;span class="n"&gt;uppercase_attr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;future_class_attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
          &lt;span class="n"&gt;uppercase_attr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="n"&gt;uppercase_attr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;

  &lt;span class="c1"&gt;# let `type` do the class creation&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;future_class_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;future_class_parents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uppercase_attr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;__metaclass__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;upper_attr&lt;/span&gt; &lt;span class="c1"&gt;# this will affect all classes in the module&lt;/span&gt;

&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="c1"&gt;# global __metaclass__ won&amp;#39;t work with &amp;quot;object&amp;quot; though&lt;/span&gt;
  &lt;span class="c1"&gt;# but we can define __metaclass__ here instead to affect only this class&lt;/span&gt;
  &lt;span class="c1"&gt;# and this will work with &amp;quot;object&amp;quot; children&lt;/span&gt;
  &lt;span class="n"&gt;bar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;bip&amp;#39;&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;bar&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# Out: False&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;BAR&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# Out: True&lt;/span&gt;

&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BAR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Out: &amp;#39;bip&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now, let's do exactly the same, but using a real class for a metaclass:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;# remember that `type` is actually a class like `str` and `int`&lt;/span&gt;
&lt;span class="c1"&gt;# so you can inherit from it&lt;/span&gt;
&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;UpperAttrMetaclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; 
    &lt;span class="c1"&gt;# __new__ is the method called before __init__&lt;/span&gt;
    &lt;span class="c1"&gt;# it&amp;#39;s the method that creates the object and returns it&lt;/span&gt;
    &lt;span class="c1"&gt;# while __init__ just initializes the object passed as parameter&lt;/span&gt;
    &lt;span class="c1"&gt;# you rarely use __new__, except when you want to control how the object&lt;/span&gt;
    &lt;span class="c1"&gt;# is created.&lt;/span&gt;
    &lt;span class="c1"&gt;# here the created object is the class, and we want to customize it&lt;/span&gt;
    &lt;span class="c1"&gt;# so we override __new__&lt;/span&gt;
    &lt;span class="c1"&gt;# you can do some stuff in __init__ too if you wish&lt;/span&gt;
    &lt;span class="c1"&gt;# some advanced use involves overriding __call__ as well, but we won&amp;#39;t&lt;/span&gt;
    &lt;span class="c1"&gt;# see this&lt;/span&gt;
    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;__new__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;upperattr_metaclass&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;future_class_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                &lt;span class="n"&gt;future_class_parents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;future_class_attr&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

        &lt;span class="n"&gt;uppercase_attr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;future_class_attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;uppercase_attr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;uppercase_attr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;future_class_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;future_class_parents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uppercase_attr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;But this is not really OOP. We call &lt;code&gt;type&lt;/code&gt; directly and we don't
override call the parent &lt;code&gt;__new__&lt;/code&gt;. Let's do it:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;UpperAttrMetaclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;__new__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;upperattr_metaclass&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;future_class_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                &lt;span class="n"&gt;future_class_parents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;future_class_attr&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

        &lt;span class="n"&gt;uppercase_attr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;future_class_attr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;uppercase_attr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;uppercase_attr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;

        &lt;span class="c1"&gt;# reuse the type.__new__ method&lt;/span&gt;
        &lt;span class="c1"&gt;# this is basic OOP, nothing magic in there&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__new__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;upperattr_metaclass&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;future_class_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                            &lt;span class="n"&gt;future_class_parents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uppercase_attr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You may have noticed the extra argument &lt;code&gt;upperattr_metaclass&lt;/code&gt;. There is
nothing special about it: a method always receives the current instance
as first parameter. Just like you have &lt;code&gt;self&lt;/code&gt; for ordinary methods.&lt;/p&gt;
&lt;p&gt;Of course, the names I used here are long for the sake of clarity, but
like for &lt;code&gt;self&lt;/code&gt;, all the arguments have conventional names. So a real
production metaclass would look like this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;UpperAttrMetaclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;__new__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;clsname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bases&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dct&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

        &lt;span class="n"&gt;uppercase_attr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dct&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;uppercase_attr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;uppercase_attr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__new__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;clsname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bases&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uppercase_attr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;We can make it even cleaner by using &lt;code&gt;super&lt;/code&gt;, which will ease
inheritance (because yes, you can have metaclasses, inheriting from
metaclasses, inheriting from type):&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;UpperAttrMetaclass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;__new__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;clsname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bases&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dct&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

        &lt;span class="n"&gt;uppercase_attr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dct&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;uppercase_attr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;uppercase_attr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UpperAttrMetaclass&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__new__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;clsname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bases&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uppercase_attr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;That's it. There is really nothing more about metaclasses.&lt;/p&gt;
&lt;p&gt;The reason behind the complexity of the code using metaclasses is not
because of metaclasses, it's because you usually use metaclasses to do
twisted stuff relying on introspection, manipulating inheritance, vars
such as &lt;code&gt;__dict__&lt;/code&gt;, etc.&lt;/p&gt;
&lt;p&gt;Indeed, metaclasses are especially useful to do black magic, and
therefore complicated stuff. But by themselves, they are simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;intercept a class creation&lt;/li&gt;
&lt;li&gt;modify the class&lt;/li&gt;
&lt;li&gt;return the modified class&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Why would you use metaclasses classes instead of functions?&lt;/h1&gt;
&lt;p&gt;Since &lt;code&gt;__metaclass__&lt;/code&gt; can accept any callable, why would you use a class
since it's obviously more complicated?&lt;/p&gt;
&lt;p&gt;There are several reasons to do so:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The intention is clear. When you read &lt;code&gt;UpperAttrMetaclass(type)&lt;/code&gt;,
    you know&lt;br /&gt;
    what's going to follow&lt;/li&gt;
&lt;li&gt;You can use OOP. Metaclass can inherit from metaclass, override
    parent methods.&lt;br /&gt;
    Metaclasses can even use metaclasses.&lt;/li&gt;
&lt;li&gt;You can structure your code better. You never use metaclasses for
    something as&lt;br /&gt;
    trivial as the above example. It's usually for something
    complicated. Having the ability to make several methods and group
    them in one class is very useful to make the code easier to read.&lt;/li&gt;
&lt;li&gt;You can hook on &lt;code&gt;__new__&lt;/code&gt;, &lt;code&gt;__init__&lt;/code&gt; and &lt;code&gt;__call__&lt;/code&gt;. Which will
    allow you to do different stuff. Even if usually you can do it all
    in &lt;code&gt;__new__&lt;/code&gt;,&lt;br /&gt;
    some people are just more comfortable using &lt;code&gt;__init__&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;These are called metaclasses, damn it! It must mean something!&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Why the hell would you use metaclasses?&lt;/h1&gt;
&lt;p&gt;Now the big question. Why would you use some obscure error prone
feature?&lt;/p&gt;
&lt;p&gt;Well, usually you don't:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Metaclasses are deeper magic than&lt;br /&gt;
 99% of users should ever worry about.&lt;br /&gt;
 If you wonder whether you need them,&lt;br /&gt;
 you don't (the people who actually&lt;br /&gt;
 need them know with certainty that&lt;br /&gt;
 they need them, and don't need an&lt;br /&gt;
 explanation about why).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;Python Guru Tim Peters&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The main use case for a metaclass is creating an API. A typical example
of this is the Django ORM.&lt;/p&gt;
&lt;p&gt;It allows you to define something like this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;  &lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IntegerField&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;But if you do this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;  &lt;span class="n"&gt;guy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;bob&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;35&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;guy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;It won't return an &lt;code&gt;IntegerField&lt;/code&gt; object. It will return an &lt;code&gt;int&lt;/code&gt;, and
can even take it directly from the database.&lt;/p&gt;
&lt;p&gt;This is possible because &lt;code&gt;models.Model&lt;/code&gt; defines &lt;code&gt;__metaclass__&lt;/code&gt; and it
uses some magic that will turn the &lt;code&gt;Person&lt;/code&gt; you just defined with simple
statements into a complex hook to a database field.&lt;/p&gt;
&lt;p&gt;Django makes something complex look simple by exposing a simple API and
using metaclasses, recreating code from this API to do the real job
behind the scenes.&lt;/p&gt;
&lt;h1&gt;The last word&lt;/h1&gt;
&lt;p&gt;First, you know that classes are objects that can create instances.&lt;/p&gt;
&lt;p&gt;Well in fact, classes are themselves instances. Of metaclasses.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;pass&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="mi"&gt;142630324&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Everything is an object in Python, and they are all either instances of
classes or instances of metaclasses.&lt;/p&gt;
&lt;p&gt;Except for &lt;code&gt;type&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;type&lt;/code&gt; is actually its own metaclass. This is not something you could&lt;br /&gt;
reproduce in pure Python, and is done by cheating a little bit at the
implementation&lt;br /&gt;
level.&lt;/p&gt;
&lt;p&gt;Secondly, metaclasses are complicated. You may not want to use them for
very simple class alterations. You can change classes by using two
different techniques:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;monkey patching&lt;/li&gt;
&lt;li&gt;class decorators&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;99% of the time you need class alteration, you are better off using
these.&lt;/p&gt;
&lt;p&gt;But 99% of the time, you don't need class alteration at all :-)&lt;/p&gt;
&lt;p&gt;source : &lt;a href="http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python?rq=1"&gt;What is a metaclass in python (stackoverflow)&lt;/a&gt;&lt;/p&gt;</summary>
    <category term="about metaclass"/>
    <category term="metaclass"/>
    <category term="metaclasses"/>
    <category term="metaclasses in python"/>
    <category term="python"/>
    <category term="usefulness of metaclasses"/>
    <category term="when to use meta class"/>
  </entry>
  <entry>
    <title>Making a Reddit + twitter Bot</title>
    <link href="http://yasoob.github.io/blog/making-a-reddit-twitter-bot" rel="alternate"/>
    <updated>2013-09-14T19:45:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-09-14:making-a-reddit-twitter-bot</id>
    <summary type="html">&lt;p&gt;Hi there pythonistas. I hope you are all fine. In this post I am going
to teach you how we can make a Reddit + Twitter bot. What this bot will
do is that it will copy post titles and url from any subreddit that you
want and then it will post them to twitter keeping the 140 characters
length in mind.&lt;!--more--&gt; Firstly let me tell you what Reddit is.
Reddit is a social link sharing site where good links are upvoted and
bad links are down voted. So lets start.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Required External Libraries&lt;/strong&gt;&lt;br /&gt;
&lt;strong&gt;1.&lt;/strong&gt; Praw - (Reddidt API wrapper in python) &lt;code&gt;pip install praw&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;2.&lt;/strong&gt; Requests - (HTTP library) &lt;code&gt;pip install requests&lt;/code&gt;&lt;br /&gt;
&lt;strong&gt;3.&lt;/strong&gt; Tweepy - (Twitter python API) &lt;code&gt;pip install tweepy&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First step - Register Yourself&lt;/strong&gt;&lt;br /&gt;
So first of all you will have to register an app on
http://dev.twitter.com/apps and after registering copy the&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;access&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;
&lt;span class="n"&gt;access&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="n"&gt;secret&lt;/span&gt;
&lt;span class="n"&gt;consumer&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;
&lt;span class="n"&gt;consumer&lt;/span&gt; &lt;span class="n"&gt;secret&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You will have to edit the permissions for your app under the settings
tab and grant your application read and write permission. So now we are
ready to move on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Start by importing&lt;/strong&gt;&lt;br /&gt;
So now lets start writing our script. First of all we will have to
import the required libraries and set up some basic variables:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;praw&lt;/span&gt;
&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tweepy&lt;/span&gt;
&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt;

&lt;span class="n"&gt;access_token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;YOUR ACCESS TOKEN HERE&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;access_token_secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;YOUR ACCESS TOKEN SECRET HERE&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;consumer_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;YOUR CONSUMER KEY HERE&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;consumer_secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;YOUR CONSUMER SECRET HERE&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Initiate connection with Reddit&lt;/strong&gt;&lt;br /&gt;
Now we have to initiate connection with Reddit. Lets define a function
to do just that.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;setup_connection_reddit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subreddit&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;[bot] setting up connection with Reddit&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;praw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Reddit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;yasoob_python reddit twitter bot &amp;#39;&lt;/span&gt;
                &lt;span class="s"&gt;&amp;#39;monitoring %s&amp;#39;&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;subreddit&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; 
    &lt;span class="n"&gt;subreddit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_subreddit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subreddit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;subreddit&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This method connects with Reddit and gets the subreddit of our choice
and then returns that subreddit for us to work further with.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Get posts and links from Reddit&lt;/strong&gt;&lt;br /&gt;
So now we have to define a function that gets the list of posts and
there urls from Reddit for us. So lets just do that as well.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;tweet_creator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subreddit_info&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;post_dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="n"&gt;post_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;[bot] Getting posts from Reddit&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;submission&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;subreddit_info&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_hot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="c1"&gt;# strip_title function is defined later&lt;/span&gt;
        &lt;span class="n"&gt;post_dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;strip_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;
        &lt;span class="n"&gt;post_ids&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;[bot] Generating short link using goo.gl&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;mini_post_dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;post_dict:&lt;/span&gt;
        &lt;span class="n"&gt;post_title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;
        &lt;span class="n"&gt;post_link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;post_dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;   
                &lt;span class="c1"&gt;# the shorten function is defined later     &lt;/span&gt;
        &lt;span class="n"&gt;short_link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;shorten&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post_link&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;mini_post_dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;post_title&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;short_link&lt;/span&gt; 
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;mini_post_dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post_ids&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;First of all we are declaring a dictionary to hold the post title and
link and after that we are making a list to hold the unique ids of every
post that we grab. This is used to track which posts we have already
grabbed. After that we are looping over the posts and appending values
to the dictionary and the list. If you use twitter very frequently then
you know that how disgusting long links look like so in order to tackle
that we are using goo.gl to generate short links for us. That's the next
thing we have done in the above function. We loop over the post dict and
make a short link for every link and append it to a new dictionary which
is &lt;code&gt;mini_post_dict&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;No one likes long links&lt;/strong&gt;&lt;br /&gt;
Now lets define a function which will actually shorten the links for
us. So here it is:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;shorten&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;content-type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;longUrl&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;https://www.googleapis.com/urlshortener/v1/url&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;link&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The above function contains a header and a payload which we are going to
send to google and after that google will return the short link in the
form of json.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Twitter hates more than 140 characters&lt;/strong&gt;&lt;br /&gt;
If you use twitter regularly then I am sure that you know that twitter
does not like tweets that are more than 140 characters. So in order to
tackle that lets define a function that will truncate long tweets to
short ones.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;strip_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;94&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;93&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;...&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;In the above method we will pass a title and the above method will check
that whether the title is 93 characters or more. If it is more than 93
characters then it will truncate it and append three dots at its end.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dealing with duplicate posts&lt;/strong&gt;&lt;br /&gt;
So now we have started to shape our final script. There is one thing
that we have to keep in mind. No one likes duplicate posts so we have to
make sure that we do not post same tweets over and over again. In order
to tackle this issue we are going to make a file with the name of
posted_posts.txt . When ever we grab a post from Reddit we will add
it's ID to this file and when posting to twitter we will check whether
the post with this ID has already been posted or not. Lets define two
more functions. The first one will write the IDs to file and the second
one will check whether the post is already posted or not.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;add_id_to_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;posted_posts.txt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;file:&lt;/span&gt;
        &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;duplicate_check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;posted_posts.txt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;file:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;file:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;line:&lt;/span&gt;
                &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Make a function for twitter will ya&lt;/strong&gt;&lt;br /&gt;
So now lets make our one of the main function. This function is
actually going to post to twitter.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;tweeter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post_dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post_ids&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tweepy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OAuthHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consumer_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;consumer_secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_access_token&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;access_token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;access_token_secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tweepy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;API&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post_id&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post_dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post_ids&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;duplicate_check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;[bot] Posting this link on twitter&amp;quot;&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;post_dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;&amp;quot; #Python #reddit #bot&amp;quot;&lt;/span&gt;
            &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;post_dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;&amp;quot; #Python #reddit #bot&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;add_id_to_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;[bot] Already posted&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Firstly we setup connection with twitter by using the credentials we
defined in the beginning. After that we loop over the post_dict and
post_ids. Then we check for duplicate posting. If it is not previously
posted then we post it and add the id of the post in the
&lt;code&gt;posted_posts.txt&lt;/code&gt; file. After posting we wait for 30 seconds so that we
do not spam twitter with tweets.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wheres the main function bud&lt;/strong&gt;&lt;br /&gt;
So lets define our last function. This function will co ordinate with
all other functions. Here is the code for that last function:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;subreddit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setup_connection_reddit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;post_dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tweet_creator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subreddit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;tweeter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post_dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So now we are ready just add this little line at the end as well:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This checks whether the script is directly executed or is it imported.
If it is directly executed only then the main() function is executed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Complete code&lt;/strong&gt;&lt;br /&gt;
Here is the complete script:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;praw&lt;/span&gt;
&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tweepy&lt;/span&gt;
&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt;

&lt;span class="n"&gt;access_token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;YOUR ACCESS TOKEN HERE&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;access_token_secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;YOUR ACCESS TOKEN SECRET HERE&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;consumer_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;YOUR CONSUMER KEY HERE&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;consumer_secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;YOUR CONSUMER SECRET HERE&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;strip_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;94&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;93&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;...&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;tweet_creator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subreddit_info&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;post_dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="n"&gt;post_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;[bot] Getting posts from Reddit&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;submission&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;subreddit_info&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_hot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;post_dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;strip_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;
        &lt;span class="n"&gt;post_ids&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;[bot] Generating short link using goo.gl&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;mini_post_dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;post_dict:&lt;/span&gt;
        &lt;span class="n"&gt;post_title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;
        &lt;span class="n"&gt;post_link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;post_dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;         
        &lt;span class="n"&gt;short_link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;shorten&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post_link&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;mini_post_dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;post_title&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;short_link&lt;/span&gt; 
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;mini_post_dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post_ids&lt;/span&gt;

&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;setup_connection_reddit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subreddit&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;[bot] setting up connection with Reddit&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;praw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Reddit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;yasoob_python reddit twitter bot &amp;#39;&lt;/span&gt;
                &lt;span class="s"&gt;&amp;#39;monitoring %s&amp;#39;&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;subreddit&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; 
    &lt;span class="n"&gt;subreddit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_subreddit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subreddit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;subreddit&lt;/span&gt;

&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;shorten&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;content-type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;longUrl&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;https://www.googleapis.com/urlshortener/v1/url&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;link&lt;/span&gt;

&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;duplicate_check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;posted_posts.txt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;file:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;file:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;line:&lt;/span&gt;
                &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;

&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;add_id_to_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;posted_posts.txt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;file:&lt;/span&gt;
        &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;subreddit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;setup_connection_reddit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;post_dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tweet_creator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subreddit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;tweeter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post_dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;tweeter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post_dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post_ids&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tweepy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OAuthHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consumer_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;consumer_secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_access_token&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;access_token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;access_token_secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tweepy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;API&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post_id&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post_dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post_ids&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;duplicate_check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;[bot] Posting this link on twitter&amp;quot;&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;post_dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;&amp;quot; #Python #reddit #bot&amp;quot;&lt;/span&gt;
            &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;post_dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;&amp;quot; #Python #reddit #bot&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;add_id_to_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;[bot] Already posted&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Save this file with the name of reddit_bot.py and make a file with the
name of posted_posts.txt and then execute the python script from the
terminal. Your output will look something like this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;yasoob&lt;/span&gt;&lt;span class="nv"&gt;@yasoob:&lt;/span&gt;&lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;Desktop&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;python&lt;/span&gt; &lt;span class="n"&gt;reddit_bot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;setting&lt;/span&gt; &lt;span class="n"&gt;up&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;Reddit&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Getting&lt;/span&gt; &lt;span class="n"&gt;posts&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;Reddit&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Generating&lt;/span&gt; &lt;span class="n"&gt;short&lt;/span&gt; &lt;span class="nb"&gt;link&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;goo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gl&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Posting&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="nb"&gt;link&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;twitter&lt;/span&gt;
&lt;span class="n"&gt;Miloslav&lt;/span&gt; &lt;span class="n"&gt;Trma&lt;/span&gt;&lt;span class="err"&gt;č&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Structured&lt;/span&gt; &lt;span class="n"&gt;Logging&lt;/span&gt; &lt;span class="n"&gt;http:&lt;/span&gt;&lt;span class="sr"&gt;//goo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sF8Xgm&lt;/span&gt; &lt;span class="c1"&gt;#Python #reddit #bot&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And after some time your posted_posts.txt file will look something like
this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;mb4y4&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;mb867&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;mb4hl&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;mbh3t&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;mbni0&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;m9bod&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;mbhpt&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;mbhnc&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;mbcp2&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;m9d2t&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;maeio&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;m9bi5&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;m8tgr&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;m86e4&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;ma5r5&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;m8fud&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;mdh1t&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;mbst4&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Goodbye&lt;/strong&gt;&lt;br /&gt;
I hope you enjoyed today's post as much as I enjoyed writing it. I hope
to see you in future with some more tutorials. Do follow my blog to give
me some support and get regular updates. Goodbye till next time.&lt;/p&gt;</summary>
    <category term="bot"/>
    <category term="python"/>
    <category term="python+reddit"/>
    <category term="pytwitter"/>
    <category term="reddit"/>
    <category term="redditpy"/>
    <category term="tutorial"/>
    <category term="twitter"/>
  </entry>
  <entry>
    <title>A surprize for you</title>
    <link href="http://yasoob.github.io/blog/a-surprize-for-you" rel="alternate"/>
    <updated>2013-09-09T19:10:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-09-09:a-surprize-for-you</id>
    <summary type="html">&lt;p&gt;Hi there pythonistas. You might have noticed that I haven't been active
much on this blog. There's a reason for that. I was preparing a PyCon
talk. Yes I was really preparing a PyCon talk. The title of the talk is
web scraping in python. I have submitted the proposal and now I am
waiting for it's acceptance. Do pray for it's acceptance and after that
you will be able to see me in Montreal next year ;) . I will keep you
updated with the status of my talk that whether it is accepted or not.&lt;/p&gt;</summary>
  </entry>
  <entry>
    <title>Making a twitter bot in python</title>
    <link href="http://yasoob.github.io/blog/increase-your-twitter-followers" rel="alternate"/>
    <updated>2013-09-04T21:53:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-09-04:increase-your-twitter-followers</id>
    <summary type="html">&lt;p&gt;Hi there guys. I hope you are fine. In this post I am going to tell you
how you can make a twitter auto favouriter or a.k.a Twitter Bot. I am
not going to make a twitter follower as it will get you banned quickly
if you use it a lot. This post is going to help you to increase your
twitter followers organically. By organically I mean that your
followers&lt;!--more--&gt; will be those who really want to listen to your
content. You can either use services on the web to increase your
followers inorganically or else you can use this script ;) . So what
affect does favouriting has on the user who's post you favourite ? When
you favourite someone's post he will get curious as who favourited his
post. Then he will visit your profile and will follow you if he likes
your tweets. So without wasting any time lets begin.&lt;/p&gt;
&lt;p&gt;The basic mechanism or the way of working of our bot will be that you
will give it a keyword like "python" and it will search twitter for that
keyword. After searching it will start favouriting the tweets from top
to bottom.&lt;/p&gt;
&lt;p&gt;First of all I am going to use "twitter" module for this project. There
are a lot of twitter related modules on PyPI but this module did the
trick so I thought to use it
(https://pypi.python.org/pypi/twitter/1.10.0) . Secondly in order to
follow along you will have to make a dev account on twitter and register
an application with any name (https://dev.twitter.com/apps). Lets begin
by importing the twitter module and initiating connection with twitter
using the OAUTH tokens. :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;twitter&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Twitter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OAuth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TwitterHTTPError&lt;/span&gt;

&lt;span class="n"&gt;OAUTH_TOKEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;your oauth token&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;OAUTH_SECRET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;your oauth secret&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;CONSUMER_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;your consumer key&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;CONSUMER_SECRET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;your consumer secret&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Twitter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;OAuth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OAUTH_TOKEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OAUTH_SECRET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;CONSUMER_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CONSUMER_SECRET&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So now we have initiated connection with twitter. This is the basic
structure of our twitter auto favouriter or a.k.a twitter bot. Now lets
move on and define a method which will search for tweets on twitter.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search_tweets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tweets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;recent&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So now we have to define a method which will favourite a tweet:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fav_tweet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tweet&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;favorites&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tweet&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Favorited: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;text&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
    &lt;span class="c"&gt;# when you have already favourited a tweet&lt;/span&gt;
    &lt;span class="c"&gt;# this error is thrown&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;TwitterHTTPError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Error: &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So now we have a searching method and a favouriting method. Now tell me
what is left ? Obviously the main code that will drive our whole program
is left. So here you go:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;auto_fav&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;search_tweets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;statuses&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;screen_name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
    &lt;span class="n"&gt;success&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;tweet&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;statuses&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;fav_tweet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tweet&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;success&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;We Favorited a total of &lt;/span&gt;&lt;span class="si"&gt;%i&lt;/span&gt;&lt;span class="s"&gt; out of &lt;/span&gt;&lt;span class="si"&gt;%i&lt;/span&gt;&lt;span class="s"&gt; tweets&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;success&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;statuses&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So thats it! We have a complete bot for twitter. This bot currently only
favourites tweets based on a keyword. Save this code in a file called
twitter_bot.py . Now you can use this bot by typing this in the
terminal:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;python&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;twitter_bot&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;twitter_bot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;auto_fav&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;#python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;20&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The above command will search for 20 latest tweets containing the
hashtag "python". After that it will favourite all of those tweets. This
bot itself works but I can not gurantee that you will get followers
quickly and I can not even gurantee that you will not get banned by
twitter for using this a lot. You can use this once in a day. Hopefully
I will write a twitter follower bot in the future as well but till then
this script is your best bet.&lt;/p&gt;
&lt;p&gt;This is the complete script:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;twitter&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Twitter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OAuth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TwitterHTTPError&lt;/span&gt;

&lt;span class="n"&gt;OAUTH_TOKEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;your oauth token&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;OAUTH_SECRET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;your oauth secret&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;CONSUMER_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;your consumer key&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;CONSUMER_SECRET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;your consumer secret&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Twitter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;OAuth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OAUTH_TOKEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OAUTH_SECRET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;CONSUMER_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CONSUMER_SECRET&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search_tweets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tweets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;recent&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fav_tweet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tweet&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;favorites&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tweet&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Favorited: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;text&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
    &lt;span class="c"&gt;# when you have already favourited a tweet&lt;/span&gt;
    &lt;span class="c"&gt;# this error is thrown&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;TwitterHTTPError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Error: &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;auto_fav&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;search_tweets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;statuses&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;screen_name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
    &lt;span class="n"&gt;success&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;tweet&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;statuses&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;fav_tweet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tweet&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;success&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;We Favorited a total of &lt;/span&gt;&lt;span class="si"&gt;%i&lt;/span&gt;&lt;span class="s"&gt; out of &lt;/span&gt;&lt;span class="si"&gt;%i&lt;/span&gt;&lt;span class="s"&gt; tweets&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;success&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;statuses&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This is the final result of running this sript:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;yasoob@yasoob:~/Desktop$ python
Python 2.7.3 (default, Apr 10 2013, 06:20:15) 
[GCC 4.6.3] on linux2
Type &amp;quot;help&amp;quot;, &amp;quot;copyright&amp;quot;, &amp;quot;credits&amp;quot; or &amp;quot;license&amp;quot; for more information.
&amp;gt;&amp;gt;&amp;gt; import twitter_bot as bot
&amp;gt;&amp;gt;&amp;gt; bot.auto_fav(&amp;#39;django&amp;#39;,1)
Favorited: Enjoying @freakboy3742’s discussion of cultural naming patterns vis a vis Django users at #DjangoCon
We Favorited a total of 1 out of 1 tweets
&amp;gt;&amp;gt;&amp;gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I hope you liked todays post. If you have any questions then feel free
to comment below and do follow us if you want to get regular updates
from our blog. If you want me to write on one specific topic then do
tell it to me in the comments below. Stay tuned for my next post.&lt;/p&gt;</summary>
    <category term="auto follower"/>
    <category term="bot"/>
    <category term="increase"/>
    <category term="increase twitter followers"/>
    <category term="increase your twitter followers"/>
    <category term="python"/>
    <category term="tutorial"/>
    <category term="twitter"/>
    <category term="twitter bot"/>
  </entry>
  <entry>
    <title>Python Resources</title>
    <link href="http://yasoob.github.io/blog/python-resources" rel="alternate"/>
    <updated>2013-09-01T15:40:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-09-01:python-resources</id>
    <summary type="html">&lt;h2&gt;Beginner's Delight&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://wiki.python.org/moin/BeginnersGuide"&gt;Beginner's guide to Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://docs.python-guide.org/en/latest/"&gt;The Hitchhiker's guide to Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://learnpythonthehardway.org/book/"&gt;Learn Python the hard way&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/edu/python/"&gt;Google's Python class&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.pythonforbeginners.com/"&gt;Python for Beginners&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codecademy.com/tracks/python"&gt;Python tracks at Codecademy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pythonmonk.com/"&gt;Python Monk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://net.tutsplus.com/tutorials/the-best-way-to-learn-python/"&gt;Best way to learn python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lurnq.com/lesson/Getting-started-with-Python-Tips-Tools-and-Resources"&gt;Python Tips, tools and resources&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gregmalcolm/python_koans"&gt;Python Koans: Learn Python through TDD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.learnstreet.com/lessons/study/python"&gt;LearnStreet Python course&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://newcoder.io/"&gt;Beginner projects for a python newbie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://learnxinyminutes.com/docs/python/"&gt;Learn X in Y minutes - Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://anandology.com/python-practice-book/"&gt;Python Practice book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nedbatchelder.com/text/names.html"&gt;Facts and myths about Python names and values&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[&lt;em&gt;args and *&lt;/em&gt;kwargs in python explained][]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.amir.rachum.com/post/54770419679/python-common-newbie-mistakes-part-1"&gt;Common newbie mistakes in Python- Part 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.amir.rachum.com/post/55024295793/python-common-newbie-mistakes-part-2"&gt;Common newbie mistakes in Python- Part 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.pyschools.com/"&gt;PySchools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.quora.com/Python-programming-language-1/What-are-some-cool-Python-tricks"&gt;Some cool Python Tricks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;http://blog.amir.rachum.com/post/30176371115/you-cant-handle-the-truth&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ozkatz.github.io/better-python-apis.html"&gt;Better Python APIs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.artlogic.com/2013/04/12/python-gotchas/"&gt;Python Gotchas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.ziade.org/2013/04/13/declaring-dependencies-in-python/"&gt;Declaring dependencies in Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Style Guide and Idioms&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.python.org/dev/peps/pep-0008/"&gt;PEP 8 - Style Guide for Python Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html"&gt;Code Like a Pythonista: Idiomatic Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Dictionary&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.amir.rachum.com/post/54458435089/python-hash-id-and-dictionary-order"&gt;Python hash, id and dictionary order&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bugs.python.org/file6941/dictnotes.txt"&gt;Notes on dictionary implementation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Decorators&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://simeonfranklin.com/blog/2012/jul/1/python-decorators-in-12-steps/"&gt;Understanding Python Decorators in 12 easy steps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.quora.com/Python-programming-language-1/What-are-common-uses-of-Python-decorators"&gt;Common uses of Python decorators - Quora&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/489720/what-are-some-common-uses-for-python-decorators"&gt;Common uses of Python decorators - Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pythonconquerstheuniverse.wordpress.com/2012/04/29/python-decorators/"&gt;Python Decorators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=240808"&gt;Decorators I: Introduction to Python Decorators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.mattalcock.com/2013/1/5/decorates-and-annotations/"&gt;Decorators and annotations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://apiguy.github.io/blog/2013/06/03/the-dark-side-of-decorators/"&gt;The dark side of decorators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://curiosityhealsthecat.blogspot.in/2013/06/thinking-out-aloud-python-decorators_8528.html"&gt;Thinking out aloud: Python decorators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://curiosityhealsthecat.blogspot.in/2013/07/using-python-decorators-for-registering_8614.html"&gt;Using Python decorators for registering callbacks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pydanny-event-notes.readthedocs.org/en/latest/PyconAU2011/decorators.html"&gt;Meta-matters: Using decorators for better Python programming&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Generators&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.dabeaz.com/generators-uk/"&gt;Generator Tricks for Systems Programmers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Yield&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained"&gt;Python yield keyword explained&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Context Managers&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://effbot.org/zone/python-with-statement.htm"&gt;Understanding Python's with statement&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Unicode&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.reddit.com/r/Python/comments/1g62eh/explain_it_like_im_five_python_and_unicode/"&gt;Explain Unicode like I'm five years old&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nedbatchelder.com/text/unipain.html"&gt;Unicode Pain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://eric.themoritzfamily.com/python-encodings-and-unicode.html"&gt;Python encodings and Unicode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lucumr.pocoo.org/2013/7/2/the-updated-guide-to-unicode/"&gt;The Updated Guide to Unicode on Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Metaclasses&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://jakevdp.github.io/blog/2012/12/01/a-primer-on-python-metaclasses/"&gt;A primer on python metaclasses&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python"&gt;What is a metaclass in Python ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.fruiapps.com/2013/03/Yet-another-Python-MetaClass-Tutorial"&gt;Yet Another Python Metaclass tutorial&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Documentation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://kennethreitz.org/documentation-is-king/"&gt;Documentation is King&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kirang89.webfactional.com/2013/05/07/make-your-open-source-project-documentation-suck-less/"&gt;Make your open source project documentation suck less&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Sphinx&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://scriptsonscripts.blogspot.in/2012/09/quick-sphinx-documentation-for-python.html"&gt;Quick Sphinx documentation for Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Debugging&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.ionelmc.ro/2013/06/05/python-debugging-tools/"&gt;Debugging Tools in Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Testing&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://pythontesting.net/framework/nose/nose-introduction/"&gt;Nose Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pythontesting.net/framework/unittest/unittest-introduction/"&gt;Unittest Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/audreyr/how-to/blob/master/python/use_coverage_with_unittest.rst"&gt;How To Use Coverage.py With Unittest&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Profiling&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.huyng.com/posts/python-performance-analysis/"&gt;A guide to analyzing Python performance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Packaging&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://hynek.me/articles/sharing-your-labor-of-love-pypi-quick-and-dirty/"&gt;Sharing Your Labor of Love: PyPI Quick And Dirty&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.jeffknupp.com/blog/2013/08/16/open-sourcing-a-python-project-the-right-way/"&gt;Open Sourcing a Python Project the Right Way&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Deployment&lt;/h2&gt;
&lt;h3&gt;Fabric&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.pythonforbeginners.com/systems-programming/how-to-use-fabric-in-a-development-environment/"&gt;Using Fabric in a development environment&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Web&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mrjoes.github.io/2013/06/21/python-realtime.html"&gt;Python and Realtime Web&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Frameworks&lt;/h3&gt;
&lt;h4&gt;Flask&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world"&gt;Flask Mega Tutorial Series&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.miguelgrinberg.com/post/designing-a-restful-api-with-python-and-flask"&gt;Designing a RESTful API with Python and Flask&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://maximebf.com/blog/2012/10/building-websites-in-python-with-flask"&gt;Building websites in Python with Flask&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mattupstate.com/python/2013/06/26/how-i-structure-my-flask-applications.html"&gt;How I structure my Flask apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.miguelgrinberg.com/post/designing-a-restful-api-using-flask-restful"&gt;Designing a RESTful API using Flask-RESTful&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.pixelmonkey.org/2013/03/13/rapid-web-prototyping-with-lightweight-tools"&gt;Rapid Web Prototyping with Lightweight Tools&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Web2Py&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://fragile.org.uk/2013/06/twitter-clone-tutorial-in-web2py-part-1-getting-started/"&gt;Building a Twitter clone in Web2Py&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Django&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.djangoproject.com/en/1.5/"&gt;The official Django documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://gettingstartedwithdjango.com/"&gt;Getting started with Django&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://arunrocks.com/building-a-hacker-news-clone-in-django-part-1/"&gt;Building a hacker news clone in Django&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ontwik.com/python/djangos-architecture-the-good-the-bad-and-the-ugly/"&gt;Django Architecture: The good, bad and ugly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;http://www.lightbird.net/dbe/&lt;/li&gt;
&lt;li&gt;http://showmedo.com/videotutorials/series?name=PPN7NA155&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Bottle&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.realpython.com/blog/python/developing-with-bottle-part-1/"&gt;Developing with Bottle- Part 1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;API and Web Services&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.pythonforbeginners.com/python-on-the-web/how-to-access-various-web-services-in-python/"&gt;How to access various web services in python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Scraping&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.pythonforbeginners.com/python-on-the-web/web-scraping-with-beautifulsoup/"&gt;Web Scraping with BeautifulSoup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gregreda.com/2013/03/03/web-scraping-101-with-python/"&gt;Web Scraping 101 with Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[How to automatically search and download torrents with Python and
    Scrapy][]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Mobile Development&lt;/h2&gt;
&lt;h3&gt;Kivy&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://archlinux.me/dusty/2013/06/13/creating-an-application-in-kivy-part-1/"&gt;Creating an app in Kivy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Image Processing&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;http://www.riisen.dk/dop/pil.html&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;WSGI&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://lucumr.pocoo.org/2007/5/21/getting-started-with-wsgi/"&gt;Getting started with WSGI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://agiliq.com/blog/2013/07/basics-wsgi/"&gt;WSGI Basics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Databases&lt;/h2&gt;
&lt;h3&gt;SQLAlchemy&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;http://www.aosabook.org/en/sqlalchemy.html&lt;/li&gt;
&lt;li&gt;http://lucumr.pocoo.org/2011/7/19/sqlachemy-and-you/&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Data Mining&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://architects.dzone.com/articles/linux-system-mining-python"&gt;Linux system mining using Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Data Analysis&lt;/h2&gt;
&lt;h3&gt;Pandas&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://pandas.pydata.org/pandas-docs/stable/10min.html"&gt;A 10 min intro to Pandas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;http://manishamde.github.io/blog/2013/03/07/pandas-and-python-top-10/&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Design Patterns&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=GZNUfkVIHAY"&gt;Python Best Practice Patterns by Vladimir Keleshev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Concurrency Patterns&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://python.dzone.com/articles/wasps-nest-lock-free"&gt;Wasps Nest Pattern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://emptysqua.re/blog/wasps-nest-read-copy-update-python/"&gt;Wasp's Nest: The Read-Copy-Update Pattern In Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Distributed Systems&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;http://architects.dzone.com/articles/gevent-zeromq&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Python 2 vs 3&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://wiki.python.org/moin/Python2orPython3"&gt;Python 2 or 3 ?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Porting to Python 3&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;http://python3porting.com/&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Books&lt;/h2&gt;
&lt;h3&gt;Free&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://pythonbooks.revolunet.com/"&gt;Some free books on Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://inventwithpython.com/chapters/"&gt;Invent with Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.greenteapress.com/thinkpython/thinkpython.pdf"&gt;Think Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://files.swaroopch.com/python/byte_of_python.pdf"&gt;Byte of Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.briggs.net.nz/snake-wrangling-for-kids.html"&gt;Snake Wrangling for Kids&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[Data Structures and Algorithms with Object-Oriented Design Patterns
    in Python][]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://en.wikibooks.org/wiki/Python_Programming"&gt;Python programming on wikibooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;http://readwrite.com/2011/03/25/python-is-an-increasingly-popu#awesm=\~oalneJOKY2tp7U&lt;/li&gt;
&lt;li&gt;&lt;a href="http://getpython3.com/diveintopython3/"&gt;Dive Into Python 3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Paid&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://wiki.python.org/moin/PythonBooks"&gt;Some list of paid books on python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Discussions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;https://news.ycombinator.com/item?id=3746692&lt;/li&gt;
&lt;li&gt;https://news.ycombinator.com/item?id=5944863&lt;/li&gt;
&lt;li&gt;http://stackoverflow.com/questions/92230/python-beyond-the-basics&lt;/li&gt;
&lt;li&gt;http://stackoverflow.com/questions/2573135/python-progression-path-from-apprentice-to-guru&lt;/li&gt;
&lt;li&gt;http://stackoverflow.com/questions/228181/zen-of-python&lt;/li&gt;
&lt;li&gt;http://stackoverflow.com/questions/101268/hidden-features-of-python&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Conferences and events&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.pycon.org/"&gt;Official PyCon website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;http://lanyrd.com/topics/python/&lt;/li&gt;
&lt;li&gt;http://lanyrd.com/topics/django/&lt;/li&gt;
&lt;li&gt;http://python.meetup.com/&lt;/li&gt;
&lt;li&gt;http://django.meetup.com/&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Videos&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=ugqu10JV7dk"&gt;Guido Van Rossum on the history of Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pyvideo.org/"&gt;PyVideo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;http://lanyrd.com/topics/python/video/&lt;/li&gt;
&lt;li&gt;http://showmedo.com/videotutorials/python&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rhodesmill.org/brandon/talks/"&gt;Talks by Brandon Rhodes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Editors and IDE's for Python programming&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://dbader.org/blog/setting-up-sublime-text-for-python-development"&gt;Setting up Sublime Text for Python Development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kennethreitz.org/sublime-text-2-love/"&gt;Sublime Text 2 Love by Kenneth Reitz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://opensourcehacker.com/2012/05/11/sublime-text-2-tips-for-python-and-web-developers/"&gt;Sublime Text 2 tips for Python and web developers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Miscellaneous&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://jessenoller.com/good-to-great-python-reads/"&gt;Good to great Python reads&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://java.dzone.com/articles/how-create-barcodes-your-pdfs"&gt;How to Create Barcodes in Your PDFs with Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.quora.com/What-are-good-Python-interview-questions"&gt;What are some good Python interview questions ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tech.blog.aknin.name/2010/04/02/pythons-innards-introduction/"&gt;Python innards introduction&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;source: &lt;a href="https://github.com/kirang89/pycrumbs/blob/master/pycrumbs.md"&gt;pycrumbs github&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[How to automatically search and download torrents with Python and
  Scrapy]: http://fuzz-box.blogspot.in/2013/03/how-to-automatically-search-download-torrent-python-scrapy.html
  [Data Structures and Algorithms with Object-Oriented Design Patterns
  in Python]: http://www.brpreiss.com/books/opus7/html/book.html&lt;/p&gt;</summary>
  </entry>
  <entry>
    <title>Simple Sudoku solver in python</title>
    <link href="http://yasoob.github.io/blog/sudoku-solver-in-python" rel="alternate"/>
    <updated>2013-09-01T01:43:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-09-01:sudoku-solver-in-python</id>
    <summary type="html">&lt;p&gt;Hi there pythonistas! We all know that Sudoku is a great game. Some of
us even bet on this game but did you know that you can use python to
make a Sudoku solver ? In this post I am going to share with you a
Sudoku solver written in python. From now on you will win all Sudoku
challenges. However let me tell you that I am not the original writer of
this script. I stumbled over this script on stack-overflow.
&lt;!--more--&gt;So without wasting any time let me share the script with you:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;

&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;same_row&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="sr"&gt;/9 == j/&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;same_col&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt; &lt;span class="nv"&gt;9&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;same_block&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="sr"&gt;/27 == j/&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="nv"&gt;%9&lt;/span&gt;&lt;span class="sr"&gt;/3 == j%9/&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="n"&gt;excluded_numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;81&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;same_row&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;same_col&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;same_block&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
      &lt;span class="n"&gt;excluded_numbers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;123456789&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;excluded_numbers:&lt;/span&gt;
      &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;81&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Usage: python sudoku.py puzzle&amp;#39;&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;  where puzzle is an 81 character string &lt;/span&gt;
&lt;span class="s"&gt;             representing the puzzle read left-to-right,&lt;/span&gt;
&lt;span class="s"&gt;             top-to-bottom, and 0 is a blank&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Hey there wait! let me share with you a shorter obfuscated version of
the same Sudoku solving script. However this short version of Sudoku
solver is a lot slower but I think that I should share it with you just
to show you that even in python obfuscated code can be written. So here
is the shorter obfuscated version:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;);[&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;
&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;%9&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="sr"&gt;/9^j/&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="sr"&gt;/27^j/&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="nv"&gt;%9&lt;/span&gt;&lt;span class="sr"&gt;/3^j%9/&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;
&lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;81&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;%d&amp;#39;&lt;/span&gt;&lt;span class="nv"&gt;%5&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt; &lt;span class="nb"&gt;import&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If you liked this post about Sudoku solver then don't forget to share
this on twitter and facebook. If you want to get regular updates then
don't forget to follow our blog.&lt;/p&gt;</summary>
    <category term="online sudoku"/>
    <category term="python"/>
    <category term="sudoku"/>
    <category term="sudoku solver"/>
    <category term="tutorial"/>
  </entry>
  <entry>
    <title>Fixing error - maximum recursion depth reached</title>
    <link href="http://yasoob.github.io/blog/fixing-error-maximum-recursion-depth-reached" rel="alternate"/>
    <updated>2013-08-31T00:35:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-08-31:fixing-error-maximum-recursion-depth-reached</id>
    <summary type="html">&lt;p&gt;Hi there folks. In this post I am going to teach you how to increase the
recursion depth in python. Most of us at some time get this error :&lt;!--more--&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="ne"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;maximum&lt;/span&gt; &lt;span class="n"&gt;recursion&lt;/span&gt; &lt;span class="n"&gt;depth&lt;/span&gt; &lt;span class="n"&gt;exceeded&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If you want to fix this error just increase the default recursion depth
limit but how to do it ? Just import the sys module in your script and
in the beginning of the script type this :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setrecursionlimit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This will increase the default limit to 1500. For the record the default
limit is 1000. I hope that you found this post useful. Do share this on
facebook and twitter and stay tuned for our next post.&lt;/p&gt;</summary>
    <category term="debug"/>
    <category term="default limit"/>
    <category term="error"/>
    <category term="help"/>
    <category term="increase"/>
    <category term="python"/>
    <category term="recursion"/>
  </entry>
  <entry>
    <title>Looking Inside Dropbox - whitepaper</title>
    <link href="http://yasoob.github.io/blog/looking-inside-dropbox-whitepaper" rel="alternate"/>
    <updated>2013-08-30T14:53:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-08-30:looking-inside-dropbox-whitepaper</id>
    <summary type="html">&lt;p&gt;Hi there folks. We all know that dropbox is made in python. It's website
is made with pyramid and it's desktop applications are made with python.
The existing Python bytecode reversing techniques are not enough for
reversing hardened applications like Dropbox. Recently I came
accross&lt;!--more--&gt; a whitepaper written by Dhiru Kholia and Przemysław
Wegrzyn. This paper presents new and generic techniques, to reverse
engineer frozen Python applications, which are not limited to just the
Dropbox world. It describes a method to bypass Dropbox's two factor
authentication and hijack Dropbox accounts. Additionally, generic
techniques to intercept SSL data using code injection techniques and
monkey patching are presented. The methods presented in this whitepaper
are not limited to dropbox.&lt;/p&gt;
&lt;p&gt;You can download this whitepaper from &lt;a href="https://www.usenix.org/system/files/conference/woot13/woot13-kholia.pdf"&gt;usenix website.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Do share your views after reading this whitepaper and don't hesitate
following us in order to get regular updates.&lt;/p&gt;</summary>
    <category term="application"/>
    <category term="dropbox"/>
    <category term="hack"/>
    <category term="python"/>
    <category term="reverse engineer"/>
  </entry>
  <entry>
    <title>Finding the module version</title>
    <link href="http://yasoob.github.io/blog/finding-the-module-version" rel="alternate"/>
    <updated>2013-08-28T08:57:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-08-28:finding-the-module-version</id>
    <summary type="html">&lt;p&gt;Hi there folks. I know I have not been active recently and it was
because I was not in town. I was in Canada. So this post will be short.
In this post i will show you how you can find the version number of any
python module. Sometimes you need to find the version number&lt;!--more--&gt;
in order to know whether you have the desired version of the module or
not. So here is the trick.&lt;/p&gt;
&lt;p&gt;\1. First of all launch python:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;python&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;\2. Import the module which in our case is requests:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;\3. Lastly type this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__version__&lt;/span&gt;
&lt;span class="s"&gt;&amp;#39;1.2.3&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So I hope you got the trick. If you have any questions then feel free to
post them below and stay tuned for the next post.&lt;/p&gt;</summary>
    <category term="how to"/>
    <category term="module"/>
    <category term="python"/>
    <category term="tutorial"/>
    <category term="version"/>
  </entry>
  <entry>
    <title>Extracting pixel values of an image in python</title>
    <link href="http://yasoob.github.io/blog/extracting-pixel-values-of-an-image-in-python" rel="alternate"/>
    <updated>2013-08-28T08:38:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-08-28:extracting-pixel-values-of-an-image-in-python</id>
    <summary type="html">&lt;p&gt;This is a very nice post which teaches you some of the basics of PIL
(python imaging library) . Make sure that you read it if you are
interested in images.&lt;/p&gt;</summary>
  </entry>
  <entry>
    <title>Making a song downloader with python</title>
    <link href="http://yasoob.github.io/blog/making-a-song-downloader-with-python" rel="alternate"/>
    <updated>2013-08-13T22:50:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-08-13:making-a-song-downloader-with-python</id>
    <summary type="html">&lt;p&gt;Hi there folks. Some time ago i was very much interested in how music
downloaders for various websites worked. In order to learn this i went
forward to make my own downloader for ex.fm . Currently ex.fm does not
allow users to download songs so this was a very good chance for me to
learn&lt;!--more--&gt; song downloading with python. During this process i
also came forward to youtube-dl. It is a python script which allows
anyone to download music and videos from numerous websites. Now let me
tell you how i went forward to make this downloader.&lt;/p&gt;
&lt;p&gt;
First of all I opened ex.fm in chrome and also started chrome web
inspector to intercept network calls. Then i clicked on a song for it to
play. When the song started to play i saw the XHR requests made by ex.fm
. There i saw a request being made to

    ex.fm/api

. This was interesting because most websites use apis to provide info
for specific songs. I opened the link and saw that the link returned
json data with direct link to the song. That way i came to know the url
used by ex.fm to get the direct link to the song.

&lt;p&gt;
After that I wanted to know how to automate song searching from python.
For this i again opened ex.fm and chrome web inspector. This time
instead of playing a song i clicked on search and searched for a song.
Again a url got my attention. It was

    http://ex.fm/api/v3/song/search/{search term}?start=0&amp;results=20

. This url also returned json response. After i became aware of these
two urls i started to write a python script to automate this. I used
only three libraries and all three of them come preinstalled with python
(batteries included). These three libraries were

    urllib2 
    json
    sys

I won't be explaining the code here instead i will give you the code
itself. If you have any questions about the code feel free to comment
below. Lastly let me make it clear that this script can be written in
better ways but i just made it for learning purposes.

[Here is the link][] to the github repository.

  [Here is the link]: https://github.com/yasoob/ex.fm-dl</summary>
    <category term="downloader"/>
    <category term="python"/>
    <category term="script"/>
    <category term="searcher"/>
    <category term="song"/>
    <category term="tutorial"/>
  </entry>
  <entry>
    <title>Software Spotlight: Bitmessage</title>
    <link href="http://yasoob.github.io/blog/software-spotlight-bitmessage" rel="alternate"/>
    <updated>2013-08-13T22:15:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-08-13:software-spotlight-bitmessage</id>
    <summary type="html">&lt;p&gt;One of the latest application made with python. Definitely worth
checking out. Do share your views in the comments below.&lt;/p&gt;</summary>
  </entry>
  <entry>
    <title>Storing and Loading Data with JSON</title>
    <link href="http://yasoob.github.io/blog/storing-and-loading-data-with-json" rel="alternate"/>
    <updated>2013-08-08T04:55:00-04:00</updated>
    <author>
      <name>phihag</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-08-08:storing-and-loading-data-with-json</id>
    <summary type="html">&lt;p&gt;We've already &lt;a href="http://freepythontips.wordpress.com/2013/08/02/what-is-pickle-in-python/"&gt;learned about pickle&lt;/a&gt;, so why do we need another way to
(de)serialize Python objects to(from) disk or a network connection?
There are three major reasons to prefer JSON over &lt;!--more--&gt;pickle:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When you're unpickling data, you're essentially allowing your data
    source to &lt;a href="http://blog.nelhage.com/2011/03/exploiting-pickle/"&gt;execute arbitrary Python commands&lt;/a&gt;. If the data is
    trustworthy (say stored in a sufficiently protected directory), that
    may not be a problem, but it's often really easy to accidentally
    leave a file unprotected (or read something from network). In these
    cases, you want to load data, and not execute potentially malicious
    Python code!&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pickled data is not easy to read, and virtually impossible to write
    for humans. For example, the pickled version of &lt;code&gt;{"answer": [42]}&lt;/code&gt;
    looks like this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dp0&lt;/span&gt;
&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;answer&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;p1&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lp2&lt;/span&gt;
&lt;span class="n"&gt;I42&lt;/span&gt;
&lt;span class="n"&gt;as&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In contrast, the JSON representation of &lt;code&gt;{"answer": [42]}&lt;/code&gt; is ....
&lt;code&gt;{"answer": [42]}&lt;/code&gt;. If you can read Python, you can read JSON; since
&lt;em&gt;all&lt;/em&gt; JSON is valid Python code!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pickle is Python-specific. In fact, by default, the bytes generated
    by Python 3's pickle cannot be read by a Python 2.x application!
    JSON can be read by virtually any programming language - just scroll
    down on the &lt;a href="http://json.org/"&gt;official homepage&lt;/a&gt; to see &lt;a href="http://jackson.codehaus.org/"&gt;implementations&lt;/a&gt; &lt;a href="http://james.newtonking.com/pages/json-net.aspx"&gt;in&lt;/a&gt;
    &lt;a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm"&gt;all&lt;/a&gt; &lt;a href="http://docs.python.org/library/json.html"&gt;major&lt;/a&gt; &lt;a href="http://www.php.net/releases/5_2_0.php"&gt;and&lt;/a&gt; &lt;a href="http://json.rubyforge.org/"&gt;some&lt;/a&gt; &lt;a href="http://hackage.haskell.org/cgi-bin/hackage-scripts/package/json"&gt;minor&lt;/a&gt; &lt;a href="http://golang.org/pkg/encoding/json/"&gt;languages&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So how do you get the JSON representation of an object? It's simple,
just call [&lt;code&gt;json.dumps&lt;/code&gt;][]:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;answer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;42.2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;abs&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# output:  {&amp;quot;answer&amp;quot;: [42.2], &amp;quot;abs&amp;quot;: 42}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Often, you want to write to a file or network stream. In both Python 2.x
and 3.x you can call [&lt;code&gt;dump&lt;/code&gt;][] to do that, but in 3.x the output must
be a character stream, whereas 2.x expects a byte stream.&lt;/p&gt;
&lt;p&gt;Let's look how to load what we wrote. Fittingly, the function to load is
called &lt;code&gt;loads&lt;/code&gt; (to load from a string) / &lt;code&gt;load&lt;/code&gt; (to load from a stream):&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="n"&gt;obj_json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;{&amp;quot;answer&amp;quot;: [42.2], &amp;quot;abs&amp;quot;: 42}&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj_json&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;When the objects we load and store grow larger, we puny humans often
need some hints on where a new sub-object starts. To get these, simply
pass an indent size, like this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;answer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;42.2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;abs&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now, the output will be a beautiful&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s"&gt;&amp;quot;abs&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="s"&gt;&amp;quot;answer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="mf"&gt;42.2&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I often use this indentation feature to debug complex data structures.&lt;/p&gt;
&lt;p&gt;The price of JSON's interoperability is that we cannot store arbitrary
Python objects. In fact, JSON can only store the following objects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;character strings&lt;/li&gt;
&lt;li&gt;numbers&lt;/li&gt;
&lt;li&gt;booleans (&lt;code&gt;True&lt;/code&gt;/&lt;code&gt;False&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;None&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;lists&lt;/li&gt;
&lt;li&gt;dictionaries with character string keys&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every object that's not one of these must be converted - that includes
&lt;em&gt;every&lt;/em&gt; object of a custom class. Say we have an object &lt;code&gt;alice&lt;/code&gt; as
follows:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;
&lt;span class="n"&gt;alice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Alice A. Adams&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;secret&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;then converting this object to JSON will fail:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="k"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;lt;stdin&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="sr"&gt;&amp;lt;module&amp;gt;&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;/usr/lib/python3.3/json/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;236&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dumps&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_default_encoder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;/usr/lib/python3.3/json/encoder.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;191&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;encode&lt;/span&gt;
    &lt;span class="n"&gt;chunks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iterencode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_one_shot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;/usr/lib/python3.3/json/encoder.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;249&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;iterencode&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_iterencode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;/usr/lib/python3.3/json/encoder.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;173&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;
    &lt;span class="n"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;&amp;quot; is not JSON serializable&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;TypeError:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;__main__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="n"&gt;object&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mh"&gt;0x7f2eccc88150&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;JSON&lt;/span&gt; &lt;span class="n"&gt;serializable&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Fortunately, there is a simple hook for conversion: Simply define a
&lt;code&gt;default&lt;/code&gt; method.:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;jdefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__dict__&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;jdefault&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# outputs: {&amp;quot;password&amp;quot;: &amp;quot;secret&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;Alice A. Adams&amp;quot;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;o.__dict__&lt;/code&gt; is a simple catch-all for user-defined objects, but we can
also add support for other objects. For example, let's add support for
&lt;a href="http://docs.python.org/dev/library/stdtypes.html#set"&gt;sets&lt;/a&gt; by treating them like lists:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;jdefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__dict__&lt;/span&gt;

&lt;span class="n"&gt;pets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Tiger&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Panther&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Toad&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pets&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;jdefault&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# outputs: [&amp;quot;Tiger&amp;quot;, &amp;quot;Panther&amp;quot;, &amp;quot;Toad&amp;quot;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;For more options and details (&lt;code&gt;ensure_ascii&lt;/code&gt; and &lt;code&gt;sort_keys&lt;/code&gt; may be
interesting options to set), have a look at the &lt;a&gt;official
documentation for JSON&lt;/a&gt;. JSON is available by default in Python 2.6
and newer, before that you can use &lt;a href="https://pypi.python.org/pypi/simplejson/"&gt;simplejson&lt;/a&gt; &lt;a href="http://freepythontips.wordpress.com/2013/07/30/make-your-programs-compatible-with-python-2-and-3-at-the-same-time/"&gt;as a fallback&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You might also like :&lt;/strong&gt;&lt;br /&gt;
*) &lt;a href="http://freepythontips.wordpress.com/2013/08/07/the-self-variable-in-python-explained/"&gt;The self variable in python explained&lt;/a&gt;&lt;br /&gt;
*) &lt;a href="http://freepythontips.wordpress.com/2013/08/06/python-socket-network-programming/"&gt;Python socket network programming&lt;/a&gt;&lt;br /&gt;
*) [*args and **kwargs in python explained][]&lt;/p&gt;</summary>
    <category term="json"/>
    <category term="pickle"/>
    <category term="python"/>
    <category term="serialization"/>
    <category term="tutorial"/>
  </entry>
  <entry>
    <title>The self variable in python explained</title>
    <link href="http://yasoob.github.io/blog/the-self-variable-in-python-explained" rel="alternate"/>
    <updated>2013-08-07T02:21:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-08-07:the-self-variable-in-python-explained</id>
    <summary type="html">&lt;p&gt;Hi there fellas. In this post I am going to teach you about the &lt;code&gt;self&lt;/code&gt;
variable in python. I have seen many beginners struggling to grasp the
concept of &lt;code&gt;self&lt;/code&gt; variable. If you are one of them then this post is for
you. So lets start by making a class&lt;!--more--&gt; involving the &lt;code&gt;self&lt;/code&gt;
variable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A simple class :&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So here is our class:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Restaurant&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;bankrupt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;False&lt;/span&gt;
    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;open_branch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bankrupt:&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;branch opened&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;First let me explain the above code without the technicalities. First of
all we make a class Restaurant. Then we assign it a property "bankrupt"
which is currently false. After that we assign it a function
open_branch which can only occur if "bankrupt" is False which means
that the Restaurant has some money.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Making a resturant:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now that we have made a class for a Restaurant, lets actually make a
resturant:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Restaurant&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now x is a Restaurant which has a property bankrupt and a function
open_branch. Now we can access the property bankrupt by typing:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bankrupt&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The above command is same as:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;Restaurant&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bankrupt&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now you can see that self refers to the bound variable or object. In the
first case it was x because we had assigned the Restaurant class to x
whereas in the second case it referred to Restaurant(). Now if we have
another Restaurant y, self will know to access the bankrupt value of y
and not x. For example check this example:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Restaurant&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bankrupt&lt;/span&gt;
&lt;span class="n"&gt;False&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Restaurant&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bankrupt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;True&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bankrupt&lt;/span&gt;
&lt;span class="n"&gt;True&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bankrupt&lt;/span&gt;
&lt;span class="n"&gt;False&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The first argument of every class method, including __init__, is
always a reference to the current instance of the class. By convention,
this argument is always named self. In the __init__ method, self
refers to the newly created object; in other class methods, it refers to
the instance whose method was called. For example the below code is the
same as the above code.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Restaurant&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;object&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;bankrupt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;False&lt;/span&gt;
    &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;open_branch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bankrupt:&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;branch opened&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Free Tip:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;However self is not a reserved keyword in python it's just a strong
convention. Many people say that why do we have to write self ? Why
can't we have it set automatically like in Java ? Someone also filed a
PEP (improvement suggestion) in which he suggested to remove the
explicit assignment of self keyword. However Guido Van Rossum (the maker
of python) wrote &lt;a href="http://neopythonic.blogspot.com/2008/10/why-explicit-self-has-to-stay.html"&gt;a blogpost in which he told why explicit self has to
stay&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I hope you have understood to concept of self. If you have any other
questions then feel free to comment. If you liked this post then make
sure that you share it on facebook, tweet it on twitter and follow our
blog.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You might also like:&lt;/strong&gt;&lt;br /&gt;
*) &lt;a href="http://freepythontips.wordpress.com/2013/08/06/python-socket-network-programming/"&gt;Python socket network programming&lt;/a&gt;&lt;br /&gt;
*) [*args and **kwargs in python explained][]&lt;br /&gt;
*) &lt;a href="http://freepythontips.wordpress.com/2013/08/03/a-url-shortener-in-python/"&gt;Making a url shortener in python&lt;/a&gt;&lt;/p&gt;</summary>
    <category term="beginner"/>
    <category term="learn"/>
    <category term="python"/>
    <category term="self"/>
    <category term="self in python"/>
    <category term="self keyword"/>
    <category term="self variable"/>
    <category term="self variable in python explained"/>
  </entry>
  <entry>
    <title>Python socket network programming</title>
    <link href="http://yasoob.github.io/blog/python-socket-network-programming" rel="alternate"/>
    <updated>2013-08-06T02:06:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-08-06:python-socket-network-programming</id>
    <summary type="html">&lt;p&gt;Hi there fellows. In this post I am going to take you on an adventure
with python sockets. They are the real backbones behind web browsing. In
simpler terms there is a server and a client. We will deal with the
client first. So lets first begin by importing &lt;!--more--&gt;the socket
library and making a simple socket.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="nb"&gt;socket&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Here we made a socket instance and passed it two parameters. The first
parameter is AF_INET and the second one is SOCK_STREAM. AF_INET
refers to the address family ipv4. ipv6 requires something different but
we won't be focusing on it. Secondly the SOCK_STREAM means connection
oriented TCP protocol. Now we will connect to a server using this
socket.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Connecting to a server&lt;/strong&gt;:&lt;br /&gt;
Well firstly let me tell you that if any error occurs during the
creation of a socket then a socket.error is thrown and secondly we can
only connect to a server by knowing it's ip. You can find the ip of the
server by doing this in the command prompt or the terminal:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;ping&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;google&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You can also find the ip using python:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="nb"&gt;socket&lt;/span&gt;

&lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;gethostbyname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;www.google.com&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;ip&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So lets begin with writing our script. In this script we will connect
with google. Here's the code for it:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="nb"&gt;socket&lt;/span&gt; &lt;span class="c1"&gt;# for socket&lt;/span&gt;
&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;

&lt;span class="n"&gt;try:&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Socket successfully created&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;err:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;socket creation failed with error %s&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# default port for socket&lt;/span&gt;
&lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;

&lt;span class="n"&gt;try:&lt;/span&gt;
    &lt;span class="n"&gt;host_ip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;gethostbyname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;www.google.com&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gaierror:&lt;/span&gt;
    &lt;span class="c1"&gt;# this means could not resolve the host&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;there was an error resolving the host&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# connecting to the server&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;host_ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="err"&gt;&amp;quot;&lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="nb"&gt;socket&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;successfully&lt;/span&gt; &lt;span class="n"&gt;connected&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;google&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;on port == %s" %(host_ip)&lt;/p&gt;
&lt;p&gt;Now save this script and then run it. You will get something like this
in the terminal:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;Socket&lt;/span&gt; &lt;span class="n"&gt;successfully&lt;/span&gt; &lt;span class="n"&gt;created&lt;/span&gt;
&lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="nb"&gt;socket&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;successfully&lt;/span&gt; &lt;span class="n"&gt;connected&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;google&lt;/span&gt; 
&lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mf"&gt;173.194.40.19&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So what did we do here ? First of all we made a socket. Then we resolved
google's ip and lastly we connected to google. This was not useful for
us though so lets move on. So now we need to know how can we send some
data through a socket. For sending data the socket library has a
&lt;code&gt;sendall&lt;/code&gt; function. This function allows you to send data to a server to
which the socket is connected and server can also send data to the
client using this function. Now lets make a simple server-client program
to see all of this in action and hopefully it will make your concepts
more clear.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Making a server :&lt;/strong&gt;&lt;br /&gt;
First of all let me explain a little bit about a server. A server has a
&lt;code&gt;bind() method&lt;/code&gt; which binds it to a specific ip and port so that it can
listen to incoming requests on that ip and port. Next a server has a
&lt;code&gt;listen()&lt;/code&gt; method which puts the server into listen mode. This allows
the server to listen to incoming connections. And lastly a server has an
&lt;code&gt;accept()&lt;/code&gt; and &lt;code&gt;close()&lt;/code&gt; method. The accept method initiates a
connection with the client and the close method closes the connection
with the client. Now lets begin making our simple server:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;# first of all import the socket library&lt;/span&gt;
&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="nb"&gt;socket&lt;/span&gt;

&lt;span class="c1"&gt;# next create a socket object&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;         
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Socket successfully created&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# reserve a port on your computer in our&lt;/span&gt;
&lt;span class="c1"&gt;# case it is 12345 but it can be anything&lt;/span&gt;
&lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12345&lt;/span&gt;

&lt;span class="c1"&gt;# Next bind to the port&lt;/span&gt;
&lt;span class="c1"&gt;# we have not typed any ip in the ip field&lt;/span&gt;
&lt;span class="c1"&gt;# instead we have inputted an empty string&lt;/span&gt;
&lt;span class="c1"&gt;# this makes the server listen to requests &lt;/span&gt;
&lt;span class="c1"&gt;# coming from other computers on the network&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;        
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;socket binded to %s&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# put the socket into listening mode&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;socket is listening&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# a forever loop until we interrupt it or &lt;/span&gt;
&lt;span class="c1"&gt;# an error occurs&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;True:&lt;/span&gt;
   &lt;span class="c1"&gt;# Establish connection with client.&lt;/span&gt;
   &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;accept&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;     
   &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;Got connection from&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;

   &lt;span class="c1"&gt;# send a thank you message to the client. &lt;/span&gt;
   &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Thank you for connecting&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="c1"&gt;# Close the connection with the client&lt;/span&gt;
   &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So what are we doing here ? First of all we import socket which is
necessary. Then we made a socket object and reserved a port on our pc.
After that we binded our server to the specified port. Passing an empty
string means that the server can listen to incoming connections from
other computers as well. If we would have passed &lt;code&gt;127.0.0.1&lt;/code&gt; then it
would have listened to only those calls made within the local computer.
After that we put the server into listen mode. What does &lt;code&gt;5&lt;/code&gt; mean ? It
means that 5 connections are kept waiting if the server is busy and if a
6th socket trys to connect then the connection is refused. Lastly we
make a while loop and start to accept all incoming connections and close
those connections after a thank you message to all connected sockets.
Now we have to program a client.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Making a client :&lt;/strong&gt;&lt;br /&gt;
Now we need something with which a server can interact. We could tenet
to the server like this just to know that our server is working. Type
these commands in the terminal:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;# start the server&lt;/span&gt;
&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;python&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;

&lt;span class="c1"&gt;# keep the above terminal open&lt;/span&gt;
&lt;span class="c1"&gt;# now open another terminal and type:&lt;/span&gt;
&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;telnet&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="mi"&gt;12345&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;After typing those commands you will get the following output in your
terminal:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;# in the server.py terminal you will see&lt;/span&gt;
&lt;span class="c1"&gt;# this output:&lt;/span&gt;
&lt;span class="n"&gt;Socket&lt;/span&gt; &lt;span class="n"&gt;successfully&lt;/span&gt; &lt;span class="n"&gt;created&lt;/span&gt;
&lt;span class="nb"&gt;socket&lt;/span&gt; &lt;span class="n"&gt;binded&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;12345&lt;/span&gt;
&lt;span class="nb"&gt;socket&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;listening&lt;/span&gt;
&lt;span class="n"&gt;Got&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;127.0.0.1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;52617&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# In the telnet terminal you will get this:&lt;/span&gt;
&lt;span class="n"&gt;Trying&lt;/span&gt; &lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;Trying&lt;/span&gt; &lt;span class="mf"&gt;127.0.0.1&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;Connected&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Escape&lt;/span&gt; &lt;span class="n"&gt;character&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;^]&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Thank&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;connectingConnection&lt;/span&gt; &lt;span class="n"&gt;closed&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;foreign&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This output shows that our server is working. Now lets make our client:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;# Import socket module&lt;/span&gt;
&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="nb"&gt;socket&lt;/span&gt;

&lt;span class="c1"&gt;# Create a socket object&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Define the port on which you want to connect&lt;/span&gt;
&lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12345&lt;/span&gt;

&lt;span class="c1"&gt;# connect to the server on local computer&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;127.0.0.1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# receive data from the server&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# close the connection&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The above script is self explanatory but still let me explain to the
beginners. First of all we make a socket object. Then we connect to
localhost on port 12345 (the port on which our server runs) and lastly
we receive data from the server and close the connection. Was that
difficult ? I hope not. Now save this file as client.py and run it from
the terminal after starting the server script:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;# start the server:&lt;/span&gt;
&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;python&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;Socket&lt;/span&gt; &lt;span class="n"&gt;successfully&lt;/span&gt; &lt;span class="n"&gt;created&lt;/span&gt;
&lt;span class="nb"&gt;socket&lt;/span&gt; &lt;span class="n"&gt;binded&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;12345&lt;/span&gt;
&lt;span class="nb"&gt;socket&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;listening&lt;/span&gt;
&lt;span class="n"&gt;Got&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;127.0.0.1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;52617&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;python&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;Thank&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;connecting&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I hope this intro to sockets in python was digestible for beginners. In
my server and client script I have not included exception handling as it
would have boggled the beginners. Now I hope that you have a solid
understanding about the working of sockets in python. However there's a
lot more to it. For further study i recommend the &lt;a href="http://docs.python.org/2/howto/sockets.html"&gt;Official python
docs&lt;/a&gt; and &lt;a href="http://www.binarytides.com/python-socket-programming-tutorial/"&gt;this article&lt;/a&gt; on binary tides. If you liked this post
then don't forget to share it on facebook, tweet it on twitter and
follow our blog.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You might also like:&lt;/strong&gt;&lt;br /&gt;
*) [*args and **kwargs in python explained][]&lt;br /&gt;
*) &lt;a href="http://freepythontips.wordpress.com/2013/08/03/a-url-shortener-in-python/"&gt;Making a url shortener in python&lt;/a&gt;&lt;br /&gt;
*) &lt;a href="http://freepythontips.wordpress.com/2013/08/01/10-inspirations-for-your-next-python-project/"&gt;10 inspirations for your next python project&lt;/a&gt;&lt;/p&gt;</summary>
    <category term="connect"/>
    <category term="network programming in python"/>
    <category term="python"/>
    <category term="python socket client disconnect"/>
    <category term="socket"/>
  </entry>
  <entry>
    <title>*args and **kwargs in python explained</title>
    <link href="http://yasoob.github.io/blog/args-and-kwargs-in-python-explained" rel="alternate"/>
    <updated>2013-08-04T18:14:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-08-04:args-and-kwargs-in-python-explained</id>
    <summary type="html">&lt;p&gt;Hi there folks. I have come to see that most new python programmers have
a hard time figuring out the *args and **kwargs magic variables. So
what are they ? First of all let me tell you that it is not necessary to
write *args or **kwargs.&lt;!--more--&gt; Only the * (aesteric) is
necessary. You could have also written *var and **vars. Writing
*args and **kwargs is just a convention. So now lets take a look at
*args first.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Usage of *args&lt;/strong&gt;&lt;br /&gt;
*args and **kwargs are mostly used in function definitions. *args
and **kwargs allow you to pass a variable number of arguments to a
function. What does variable mean here is that you do not know before
hand that how many arguments can be passed to your function by the user
so in this case you use these two keywords. *args is used to send a
&lt;strong&gt;non-keyworded&lt;/strong&gt; variable length argument list to the function. Here's
an example to help you get a clear idea:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;test_var_args&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f_arg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;first normal arg:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f_arg&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;arg&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;argv:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;another arg through *argv :&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arg&lt;/span&gt;

&lt;span class="n"&gt;test_var_args&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;yasoob&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;eggs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;test&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This produces the following result:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="n"&gt;normal&lt;/span&gt; &lt;span class="n"&gt;arg:&lt;/span&gt; &lt;span class="n"&gt;yasoob&lt;/span&gt;
&lt;span class="n"&gt;another&lt;/span&gt; &lt;span class="n"&gt;arg&lt;/span&gt; &lt;span class="n"&gt;through&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt;
&lt;span class="n"&gt;another&lt;/span&gt; &lt;span class="n"&gt;arg&lt;/span&gt; &lt;span class="n"&gt;through&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;eggs&lt;/span&gt;
&lt;span class="n"&gt;another&lt;/span&gt; &lt;span class="n"&gt;arg&lt;/span&gt; &lt;span class="n"&gt;through&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I hope this cleared away any confusion that you had. So now lets talk
about **kwargs&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Usage of **kwargs&lt;/strong&gt;&lt;br /&gt;
**kwargs allows you to pass &lt;strong&gt;keyworded&lt;/strong&gt; variable length of
arguments to a function. You should use **kwargs if you want to handle
&lt;strong&gt;named arguments&lt;/strong&gt; in a function. Here is an example to get you going
with it:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;greet_me&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;kwargs&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;None:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iteritems&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;%s == %s&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;%&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;greet_me&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;yasoob&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;yasoob&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So can you see how we handled a keyworded argument list in our function.
This is just the basics of **kwargs and you can see how useful it is.
Now lets talk about how you can use *args and **kwargs to call a
function with a list or dictionary of arguments.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Using *args and **kwargs to call a function&lt;/strong&gt;&lt;br /&gt;
So here we will see how to call a function using *args and **kwargs.
Just consider that you have this little function:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;test_args_kwargs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arg2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arg3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;arg1:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arg1&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;arg2:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arg2&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;arg3:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arg3&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now you can use *args or **kwargs to pass arguments to this little
function. Here's how to do it:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;# first with *args&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;two&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;test_args_kwargs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;arg1:&lt;/span&gt; &lt;span class="n"&gt;two&lt;/span&gt;
&lt;span class="n"&gt;arg2:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;arg3:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;

&lt;span class="c1"&gt;# now with **kwargs:&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;kwargs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;arg3&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;arg2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;two&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;arg1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;test_args_kwargs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;arg1:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="n"&gt;arg2:&lt;/span&gt; &lt;span class="n"&gt;two&lt;/span&gt;
&lt;span class="n"&gt;arg3:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Order of using *args **kwargs and formal args&lt;/strong&gt;&lt;br /&gt;
So if you want to use all three of these in functions then the order is&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;some_func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fargs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I hope you have understood the usage of *args and **kwargs. If you
have got any problems or confusions with this then feel free to comment
below. For further study i suggest the official &lt;a href="http://docs.python.org/tutorial/controlflow.html#more-on-defining-functions"&gt;python docs on defining
functions&lt;/a&gt; and [*args and **kwargs on stackoverflow][].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You might also like :&lt;/strong&gt;&lt;br /&gt;
*) &lt;a href="http://freepythontips.wordpress.com/2013/08/03/a-url-shortener-in-python/"&gt;Making a url shortener in python&lt;/a&gt;&lt;br /&gt;
*) &lt;a href="http://freepythontips.wordpress.com/2013/07/30/20-python-libraries-you-cant-live-without/"&gt;20 Python libraries you can’t live without&lt;/a&gt;&lt;br /&gt;
*) &lt;a href="http://freepythontips.wordpress.com/2013/07/30/make-your-programs-compatible-with-python-2-and-3-at-the-same-time/"&gt;Targeting python 2 and 3 at the same time.&lt;/a&gt;&lt;/p&gt;</summary>
    <category term="args"/>
    <category term="args and kwargs"/>
    <category term="kwargs"/>
    <category term="python"/>
    <category term="python decorator args kwargs"/>
    <category term="python function args kwargs"/>
    <category term="python super args kwargs"/>
  </entry>
  <entry>
    <title>Making a url shortener in python</title>
    <link href="http://yasoob.github.io/blog/a-url-shortener-in-python" rel="alternate"/>
    <updated>2013-08-03T09:54:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-08-03:a-url-shortener-in-python</id>
    <summary type="html">&lt;p&gt;Hi there fellas. Today in this post i am going to show you how we can
use python to make bulk urls tiny. Let me clear that we are not making a
url shortening SERVICE instead what we are going to do is that we are
going to unofficially use the&lt;!--more--&gt; &lt;a href="http://www.tinyurl.com"&gt;tinyurl&lt;/a&gt; api (Tinyurl is a
url shortening service). There's not any official python api released by
tinyurl. So lets begin with this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The First Step :&lt;/strong&gt;&lt;br /&gt;
So first of all we have to do some imports. We have to import 7
libraries to make this work.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;__future__&lt;/span&gt; &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;with_statement&lt;/span&gt;
&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;contextlib&lt;/span&gt;
&lt;span class="n"&gt;try:&lt;/span&gt;
    &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt; &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urlencode&lt;/span&gt;
&lt;span class="n"&gt;except&lt;/span&gt; &lt;span class="n"&gt;ImportError:&lt;/span&gt;
    &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt; &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urlencode&lt;/span&gt;
&lt;span class="n"&gt;try:&lt;/span&gt;
    &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urlopen&lt;/span&gt;
&lt;span class="n"&gt;except&lt;/span&gt; &lt;span class="n"&gt;ImportError:&lt;/span&gt;
    &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;urllib2&lt;/span&gt; &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urlopen&lt;/span&gt;
&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;We could have imported just one library to make this work but in order
to make a good url shortener we have to import these seven libraries.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Second Step :&lt;/strong&gt;&lt;br /&gt;
So now we have to start making a method that will handle the url
shortening. Watch the code closely because it is self explanatory but
however i will explain it later.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;make_tiny&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;request_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;http://tinyurl.com/api-create.php?&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; 
    &lt;span class="n"&gt;urlencode&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;}))&lt;/span&gt;
    &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;contextlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;closing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_url&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;response:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Did you manage to understand the code ? Let me explain it to the
beginners. First of all we define a &lt;code&gt;make_tiny&lt;/code&gt; function which takes a
url as an input. After that we start defining the working of our
function. The &lt;code&gt;url_encode&lt;/code&gt; takes a url as an input and encodes it i.e
escapes it. After that we append the escaped url to the end of tinyurl's
api url. Then we open the request_url using urlopen. And lastly we read
the response after converting it to utf-8. Why did we convert the
response to utf-8 ? The reason for this is that the urlopen function
returns a stream of bytes rather than a string so in order to print it
and alter it we have to convert it into utf-8. Was that difficult ?&lt;/p&gt;
&lt;p&gt;So now the next step is to get the input from the user. For this we are
going to use the sys library.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Third Step :&lt;/strong&gt;&lt;br /&gt;
So lets write the main() function for our little script. Here's the
code for it:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;tinyurl&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;make_tiny&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]):&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tinyurl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So what are we doing here ? We are getting the user input by using
sys.argv . We have not limited ourself to only one url as an input
instead we are saying that give us as many urls as you want, we will
crush them and make them tiny. What sys.argv[1:] does is that it leaves
the first two arguments (counting starts from 0) and takes all the rest
of the arguments and produces a list of those arguments. For example if
you type:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;python&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;url1&lt;/span&gt; &lt;span class="n"&gt;url2&lt;/span&gt; &lt;span class="n"&gt;url3&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;then sys.argv[1:] will leave &lt;code&gt;python&lt;/code&gt; and &lt;code&gt;script.py&lt;/code&gt; and will produce
the following list:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;url1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;url2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;url3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Wait! what is that map() function over there ? Most beginners will feel
confused as most of them have never used map. Map() is a simple way of
looping over a list and passing it to a function one by one. The map()
function above there is equivalent to :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;urls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;urls:&lt;/span&gt;
        &lt;span class="n"&gt;tinyurl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;make_tiny&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;tinyurl&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I hope the above code example cleared away any confusions about map()
function.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Fourth Step :&lt;/strong&gt;&lt;br /&gt;
Now lets wrap up our code. The only thing left is this :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Add this to the end of your code. This tells us whether the script was
executed independently from the shell or was it called by another
script. This is pretty handy if you want to use this script later in any
other project.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Finally :&lt;/strong&gt;&lt;br /&gt;
So here's the complete script:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;__future__&lt;/span&gt; &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;with_statement&lt;/span&gt;
&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;contextlib&lt;/span&gt;
&lt;span class="n"&gt;try:&lt;/span&gt;
    &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt; &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urlencode&lt;/span&gt;
&lt;span class="n"&gt;except&lt;/span&gt; &lt;span class="n"&gt;ImportError:&lt;/span&gt;
    &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt; &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urlencode&lt;/span&gt;
&lt;span class="n"&gt;try:&lt;/span&gt;
    &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urlopen&lt;/span&gt;
&lt;span class="n"&gt;except&lt;/span&gt; &lt;span class="n"&gt;ImportError:&lt;/span&gt;
    &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;urllib2&lt;/span&gt; &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urlopen&lt;/span&gt;
&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;

&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;make_tiny&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;request_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;http://tinyurl.com/api-create.php?&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; 
    &lt;span class="n"&gt;urlencode&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;}))&lt;/span&gt;
    &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;contextlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;closing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_url&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;response:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;tinyurl&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;make_tiny&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]):&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tinyurl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Considering that you have saved this script as url_shortener.py you
have to run it like this from the shell:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;python&lt;/span&gt; &lt;span class="n"&gt;url_shortener&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;url1&lt;/span&gt; &lt;span class="n"&gt;url2&lt;/span&gt; &lt;span class="n"&gt;url3&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If you want to save these tinyurls into a txt file then issue this
command:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;python&lt;/span&gt; &lt;span class="n"&gt;url_shortener&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;url1&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;urls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I hope you liked today's post. This script can work on &lt;a href="http://freepythontips.wordpress.com/2013/07/30/make-your-programs-compatible-with-python-2-and-3-at-the-same-time/"&gt;python 2 and
python 3 both&lt;/a&gt;. It was primarily aimed at two kind of audience.
Firstly those who are learning python and want to learn how to make a
simple yet useful script and those who want to learn how to make a url
shortener in python. Do share your view in the comments bellow and stay
tuned for the next post. If you want regular dose of python tips and
tutorials delivered to your doorstep then consider following my blog.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You might also like:&lt;/strong&gt;&lt;br /&gt;
* &lt;a href="http://freepythontips.wordpress.com/2013/08/02/5-quality-screencasts-worth-watching/"&gt;5 quality screencasts worth watching&lt;/a&gt;&lt;br /&gt;
* &lt;a href="http://freepythontips.wordpress.com/2013/08/01/packaging-and-distributing-your-python-libraries/"&gt;Packaging and distributing your python libraries&lt;/a&gt;&lt;br /&gt;
* &lt;a href="http://freepythontips.wordpress.com/2013/08/01/10-inspirations-for-your-next-python-project/"&gt;10 inspirations for your next python project&lt;/a&gt;&lt;/p&gt;</summary>
    <category term="beginner"/>
    <category term="python"/>
    <category term="tinyurl"/>
    <category term="tutorial"/>
    <category term="url shortener"/>
  </entry>
  <entry>
    <title>5 quality screencasts worth watching</title>
    <link href="http://yasoob.github.io/blog/5-quality-screencasts-worth-watching" rel="alternate"/>
    <updated>2013-08-02T18:27:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-08-02:5-quality-screencasts-worth-watching</id>
    <summary type="html">&lt;p&gt;Hello there fellas. I am back with another list of useful resources.
This time i am going to share with you 5 quality python screen casts
worth watching. Unlike ruby there are not really much quality screen
casts related to python out there. So without&lt;!--more--&gt; wasting a dime
lets continue with the list of those screen casts. So here it is:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt;The first one if &lt;a href="http://pycandy.com/2013-07-04/encoding-specifiers-1"&gt;Encoding Specifiers and Magical Mode Lines&lt;/a&gt; in
python. There's a lot in it for learning. Go check it out and you won't
regret it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt;The second one is by Neck Beard Republic. This one is about
&lt;a href="https://www.neckbeardrepublic.com/screencasts/lambdas-functions"&gt;lambda functions in python&lt;/a&gt;. Neck Beard Republic have great python
screen casts but most of them are paid however they have some free
screen casts as well.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt;The third one is a series of screen casts by Kenneth Love. They
are related to django. The title is &lt;a href="http://gettingstartedwithdjango.com/en/lessons/"&gt;Getting Started With Django.&lt;/a&gt;
They are great. I have personally watched them. There's something for
everyone in it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt;The fourth one is again by Neckbeard Republic. This one is a must
watch for every python programmer out there. The title of this screen
cast is [__dunder__ functions in python][]. There can be alot of
mystery involved in Python when it comes to the dunder (double
underscore) methods. This screen cast will reveal the secret behind
these function. However i have not personally watched it but it's on my
todo list.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5.&lt;/strong&gt;Ah so now comes the last one. This one is again a Neckbeard
Republic production. This one is about the &lt;a&gt;super() literal in
python&lt;/a&gt;. I can see how much effort &lt;a href="http://twitter.com/myusuf3"&gt;Mahdi Yusuf&lt;/a&gt; has put into
making these screen casts.&lt;/p&gt;
&lt;p&gt;So now we come to the end of another great post about 5 quality python
screen casts worth watching. However there are some other video
resources as well like &lt;a href="http://showmedo.com/videotutorials/python"&gt;Showmedo&lt;/a&gt; which i will cover in a future post.
If you are feeling adventurous then check out &lt;a href="http://freepythontips.wordpress.com/2013/08/01/10-inspirations-for-your-next-python-project/"&gt;10 inspirations for your
next python project&lt;/a&gt; or &lt;a href="http://freepythontips.wordpress.com/2013/08/01/packaging-and-distributing-your-python-libraries/"&gt;Packaging and distributing your python
libraries&lt;/a&gt;. I hope you liked today's post. Do share your views in the
comments below and stay tuned for the next post.&lt;/p&gt;</summary>
    <category term="inspiration"/>
    <category term="must watch"/>
    <category term="python"/>
    <category term="quality"/>
    <category term="screencasts"/>
    <category term="worth watching"/>
  </entry>
  <entry>
    <title>What is Pickle in python ?</title>
    <link href="http://yasoob.github.io/blog/what-is-pickle-in-python" rel="alternate"/>
    <updated>2013-08-02T08:59:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-08-02:what-is-pickle-in-python</id>
    <summary type="html">&lt;p&gt;Hi there fellas. In this post i am going to tell you about pickle. It is
used for serializing and de-serializing a Python object structure. Any
object in python can be pickled so that it can be saved on disk. What
pickle does is that&lt;!--more--&gt; it “serialises” the object first before
writing it to file. Pickling is a way to convert a python object (list,
dict, etc.) into a character stream. The idea is that this character
stream contains all the information necessary to reconstruct the object
in another python script.&lt;/p&gt;
&lt;p&gt;So lets continue:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; First of all you have to import it through this command:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pickle&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;pickle has two main methods. The first one is dump, which dumps an
object to a file object and the second one is load, which loads an
object from a file object.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; Prepare something to pickle:&lt;br /&gt;
Now you just have to get some data which you can pickle. For the sake
of simplicity i will be pickling a python dictionary. So just read the
below code and you will be able to figure it out yourself.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pickle&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;test value&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;test value 2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;test value 3&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;test value&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;test value 2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;test value 3&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;file_Name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;testfile&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;# open the file for writing&lt;/span&gt;
&lt;span class="n"&gt;fileObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;wb&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# this writes the object a to the&lt;/span&gt;
&lt;span class="c1"&gt;# file named &amp;#39;testfile&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;pickle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;fileObject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# here we close the fileObject&lt;/span&gt;
&lt;span class="n"&gt;fileObject&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# we open the file for reading&lt;/span&gt;
&lt;span class="n"&gt;fileObject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="c1"&gt;# load the object from the file into var b&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pickle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fileObject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;test value&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;test value 2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;test value 3&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="n"&gt;True&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The above code is self explanatory. It shows you how to import the
pickled object and assign it to a variable. So now we need to know where
we should use pickling. It is very useful when you want to dump some
object while coding in the python shell. So after dumping whenever you
restart the python shell you can import the pickled object and
deserialize it. But there are other use cases as well which i found on
&lt;a href="http://stackoverflow.com/questions/3438675/common-use-of-pickle-in-python"&gt;stackoverflow&lt;/a&gt;. Let me list them below.  &lt;/p&gt;
&lt;p&gt;&lt;code&gt;1) saving a program's state data to disk so that it can carry on where it left off when restarted (persistence)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;\2) sending python data over a TCP connection in a multi-core or
distributed system (marshalling)&lt;/p&gt;
&lt;p&gt;\3) storing python objects in a database&lt;/p&gt;
&lt;p&gt;\4) converting an arbitrary python object to a string so that it can be
used as a dictionary key (e.g. for caching &amp;amp; memoization).&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;One thing to note is that there is a brother of pickle as well with the
name of cpickle. As the name suggests it is written in c which makes it
1000 times more faster than pickle. So why should we ever use pickle
instead of cpickle ? Here's the reason  &lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; Because pickle handles unicode objects. &amp;gt;&amp;gt;&amp;gt; Because pickle is written in pure Python, it's easier to debug.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;For further reading i suggest the &lt;a href="http://docs.python.org/2/library/pickle.html"&gt;official pickle documentation&lt;/a&gt; or
if you want to read more tutorials then check out the &lt;a href="http://freepythontips.wordpress.com/2013/08/01/connecting-to-sqlite-databases/"&gt;sqlite
tutorial&lt;/a&gt;. Now we come to the end of today's post. I hope you liked
it. Do follow my blog to get regular updates. If you have any
suggestions or comments then post them below.&lt;/p&gt;</summary>
    <category term="data serialization"/>
    <category term="deserialize"/>
    <category term="pickle"/>
    <category term="python"/>
    <category term="serialize"/>
  </entry>
  <entry>
    <title>10 inspirations for your next python project</title>
    <link href="http://yasoob.github.io/blog/10-inspirations-for-your-next-python-project" rel="alternate"/>
    <updated>2013-08-01T23:27:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-08-01:10-inspirations-for-your-next-python-project</id>
    <summary type="html">&lt;p&gt;Hi there fellow coders. I know those times when we don't know what to
code. I am sure you must have experienced that time as well. Today i am
going to share with you 10 python projects that will serve as an
inspiration for your next python project. So without wasting a time
here's&lt;!--more--&gt; the list.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; &lt;a href="https://github.com/python-imaging/Pillow"&gt;Pillow&lt;/a&gt; . Pillow is the "friendly" PIL fork by Alex Clark and
Contributors. PIL is the Python Imaging Library by Fredrik Lundh and
Contributors. Alex teaches us that if you don't like something then make
a fork.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; &lt;a href="https://github.com/kennethreitz/inbox.py"&gt;Inbox.py&lt;/a&gt;. This is the simplest SMTP server you'll ever see.
It's asynchronous. One instance should handle over one thousand emails
per second. Pretty impressive.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; &lt;a href="https://github.com/Hawstein/PyMinecraft"&gt;PyMinecraft&lt;/a&gt;. Have you ever thought of implementing the famous
minecraft game into python ? Hawstein has.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; &lt;a href="https://github.com/zedshaw/fuqit"&gt;fuqit&lt;/a&gt;. The latest and greatest from Zed Shaw (the writer of
learn python the hard way) , fuqit is a web framework that attempts to
make you forget everything you have learned from MVC frameworks and
focuses on simplicity. Zed Shaw teaches us one thing through this
project "Don't panic while doing something against the trend".&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5.&lt;/strong&gt; &lt;a href="https://github.com/cenkalti/pypi-notifier"&gt;PyPI Notifier&lt;/a&gt;. Watches your requirements.txt files and
notifies you via email when a project is updated. Although i have not
used it myself but i think this project is great.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6.&lt;/strong&gt; &lt;a href="https://github.com/bmaeser/vol"&gt;Vol&lt;/a&gt;. A simple project but great inspiration. vol lets you
control your mac's audio volume from the commandline. It also has
support for profiles.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7.&lt;/strong&gt; &lt;a href="https://github.com/rg3/youtube-dl/"&gt;Youtube-dl&lt;/a&gt;. A great python project. It allows you to download
videos from various websites. It's a great project make sure that you
check it out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8.&lt;/strong&gt; &lt;a href="https://github.com/lociii/jukebox"&gt;Jukebox&lt;/a&gt;. Ever wanted to listen to music with a larger group
of people e.g. in your office? Who decides what to play? Make your music
player democratic and give everyone the chance to promote their
favourite song. This script will relieve you from numerous fights.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9.&lt;/strong&gt; &lt;a href="https://github.com/cortesi/mitmproxy"&gt;Mitmproxy&lt;/a&gt;. mitmproxy is a an SSL capable
man-in-the-middle-proxy. It allows HTTP(and other) traffic to be
inspected and edited on the fly. Don’t be caught unaware by apps like
Path any more, now you can know what data you are sending and receiving
from remote servers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10.&lt;/strong&gt; &lt;a href="https://github.com/globocom/thumbor"&gt;Thumbor&lt;/a&gt;. It is a smart imaging service. It enables on-demand
crop, resizing and flipping of images. I haven't checked it out though
but it seems promising. Do check it out if you want a server side image
cropper.&lt;/p&gt;
&lt;p&gt;So finally we come to the end of this post. I hope you found some useful
python projects in there to serve as an inspiration. Share your views in
the comments below and tell me which project you liked the most or if
you want to read further then check out my another blog post about &lt;a href="http://freepythontips.wordpress.com/2013/07/30/20-python-libraries-you-cant-live-without/"&gt;20
python libraries you can't live without&lt;/a&gt;.&lt;/p&gt;</summary>
    <category term="inspiration"/>
    <category term="must watch"/>
    <category term="python"/>
    <category term="python projects"/>
    <category term="technology"/>
    <category term="top 10"/>
  </entry>
  <entry>
    <title>Packaging and distributing your python libraries</title>
    <link href="http://yasoob.github.io/blog/packaging-and-distributing-your-python-libraries" rel="alternate"/>
    <updated>2013-08-01T14:51:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-08-01:packaging-and-distributing-your-python-libraries</id>
    <summary type="html">&lt;p&gt;Hi there fellow coders. This post will go over the basics of packaging
and deploying your python libraries. So without wasting a minute lets
get started&lt;!--more--&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Folder structure&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So first thing first. What should be your folder structure ? At minimum
you can have only two files. The first one should be the &lt;a href="http://freepythontips.wordpress.com/2013/07/29/packaging-your-python-scripts/"&gt;setup.py
file&lt;/a&gt; and the second one should be your module file. But today I am
not going to talk about the very basics. Today we are going to follow
this folder structure :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;My_module&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
    &lt;span class="n"&gt;LICENSE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
    &lt;span class="n"&gt;README&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
    &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
    &lt;span class="n"&gt;My_module&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
        &lt;span class="n"&gt;__init__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Here I have 4 files. The License file contains the license under which
you want to distribute your module. So lets move on. What should be our
second step ? Obviously it should be to describe our module and write
some meta data into the setup.py file.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Describing your module&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The setup.py file is the heart of any python module or library. It
describes the module and lists some other useful info about the module
like it lists any dependencies on which a module depends and it also
tells distutils where to find the necessary scripts of this module. So
lets describe our module with the help of our setup.py file.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;distutils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt; &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;

&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;My super module&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;0.1dev&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;My_module&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,],&lt;/span&gt;
    &lt;span class="n"&gt;license&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Creative Commons Attribution-Noncommercial-Share Alike license&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;long_description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;README.txt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Here we could have rewritten the long_description ourselves but we
reused our README file. We wrote 'dev' in the version because we still
do not have anything in our module but we are moving toward the 0.1
release. When you have enough code in your module then feel free to drop
'dev' from the version field. Now the next step is to make our first
release.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Making your first release&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So how do we make our first release ? Just follow me. Your release
should have a single archive file. It can be easily made with this
command.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;python&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;sdist&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Just go to the root of your module folder and execute this command. It
will create a subdirectory with the name of dist and will package all of
your module scripts and other files into a single archive file ready to
be uploaded on PyPI (Python Package Index). This archive file will have
the default extension of &lt;code&gt;zip&lt;/code&gt; on windows and &lt;code&gt;tar.gz&lt;/code&gt; on POSIX systems.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Publishing your module&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now that archive file can be uploaded anywhere for distribution but we
will focus on PyPI. In order to upload on PyPI you will first have to
make an account on http://pypi.python.org/pypi . After that you will
have to register your package on PyPI like this:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;cd&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="sr"&gt;/to/&lt;/span&gt;&lt;span class="n"&gt;My_module&lt;/span&gt;
&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;python&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;register&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Just use your existing login. Afte that run the following command to
upload it to PyPI.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;python&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;sdist&lt;/span&gt; &lt;span class="n"&gt;upload&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This will make the distribution one time more and will upload it to
PyPI. Now you should be proud of yourself because you have just
contributed to the opensource world. I hope you liked my post. If you
want to read about setup.py then go &lt;a href="http://freepythontips.wordpress.com/2013/07/29/packaging-your-python-scripts/"&gt;here&lt;/a&gt;. For further
study i recommend the &lt;a href="http://guide.python-distribute.org/index.html"&gt;Hichhikers guide to packaging&lt;/a&gt;. I hope you
liked today's post. Do share your views in the comments below and stay
tuned for the next post.&lt;/p&gt;</summary>
    <category term="distribute"/>
    <category term="packages"/>
    <category term="python"/>
    <category term="python libraries"/>
    <category term="uploading"/>
  </entry>
  <entry>
    <title>Connecting to Sqlite databases</title>
    <link href="http://yasoob.github.io/blog/connecting-to-sqlite-databases" rel="alternate"/>
    <updated>2013-08-01T00:48:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-08-01:connecting-to-sqlite-databases</id>
    <summary type="html">&lt;p&gt;Hi there fellas. Today i am going to teach you how to use sqlite
databases with python. This post will cover the basics of making and
using a sqlite database with python using the sqlite3 library. Okay lets
get started. Firstly if you are using python 2.5 or &lt;!--more--&gt;greater
then you will have sqlite3 installed otherwise you will have to install
it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Creating and connecting to a database&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So how do you make a database in python using the sqlite3 library ? It's
pretty simple. Just follow the code below and you will be able to make
it out on your own.&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6
7
8
9&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c"&gt;#!/usr/bin/python&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sqlite3&lt;/span&gt;

&lt;span class="c"&gt;# If the database is already created then this&lt;/span&gt;
&lt;span class="c"&gt;# code will connect to it instead of making a new one&lt;/span&gt;
&lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;test.db&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Created database successfully&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;So was that difficult ? I hope not. So lets continue. The next thing is
to make tables in our database. So how do you go about doing it ? Just
follow me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Making tables in a database&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;

&lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;test.db&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;conn:&lt;/span&gt;
    &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# create a table&lt;/span&gt;
    &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&amp;quot;CREATE TABLE books&lt;/span&gt;
&lt;span class="s"&gt;               (title text, author text)&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;In the above code we made a table with the name of book. It has the
following fields : title and author. Both of these fields have the data
type of text. First of all we made a database with the name of test.db
and after that we made a cursor object which allows us to interface with
our database and execute queries. So what now. We have created a
database and made a table. Now we have to insert some data in our table.
Lets continue.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Inserting data to the database&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;# insert some data&lt;/span&gt;
&lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;INSERT INTO books VALUES (&amp;#39;Pride and Prejudice&amp;#39;, &amp;#39;Jane Austen&amp;#39;)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# save data to database&lt;/span&gt;
&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# insert multiple records using the more secure &amp;quot;?&amp;quot; method&lt;/span&gt;
&lt;span class="n"&gt;books&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;Harry Potter&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;J.K Rowling&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;The Lord of the Rings&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;J. R. R. Tolkien&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
          &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;The Hobbit&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;J. R. R. Tolkien&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;executemany&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;INSERT INTO books VALUES (?,?)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;books&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So in the above code i showed you two ways to put some data into the
database. The first method is to execute a single query and the second
method is to execute multiple queries in the same time. In the second
method we could have used the string substitution '%s' but it is known
to be potentially dangerous and can lead to SQL Injection. So whats left
now ? Removing and updating the data ? No problem i will cover that as
well. Just examine the code below.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Updating data in the database&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;

&lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;test.db&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;conn:&lt;/span&gt;
    &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;sql&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;        UPDATE books &lt;/span&gt;
&lt;span class="s"&gt;        SET author = &amp;#39;Yasoob&amp;#39; &lt;/span&gt;
&lt;span class="s"&gt;        WHERE author = &amp;#39;J.K Rowling&amp;#39;&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;In the above code we updated our record by replacing J.K Rowling with
Yasoob. Take a look at the below code for deleting the records.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Deleting records from the database&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;

&lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;test.db&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;conn:&lt;/span&gt;
    &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;sql&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;        DELETE FROM books&lt;/span&gt;
&lt;span class="s"&gt;        WHERE author = &amp;#39;Yasoob&amp;#39;&lt;/span&gt;
&lt;span class="s"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;In the above code we deleted the record of those books whose writer was
'Yasoob'. Now i am going to show you how to display data from the table.
It is easy. Just a few lines of code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Displaying data from the database&lt;/strong&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;

&lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;test.db&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Opened database successfully&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;SELECT title, author  from books&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cursor:&lt;/span&gt;
   &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Title = &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
   &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Author = &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Operation done successfully&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;In the above code we opened our database file and displayed the records
on the screen. Do you know that we could have also done:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;:memory:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So what is this code doing ? The :memory: is a special name which
creates the database in the ram and lets you execute any query. Lastly I
would like to tell you about sqlalchemy which is a database library for
python and takes care of a lot of things for you. It does all the
escaping for you so you won't have to mess with the annoyances of
converting embedded single quotes into something that SQLite will
accept. It's a part of my &lt;a href="http://freepythontips.wordpress.com/2013/07/30/20-python-libraries-you-cant-live-without/"&gt;previous blog post&lt;/a&gt; as well.&lt;/p&gt;
&lt;p&gt;So now goodbye to you all. I hope you liked reading today's post as much
as i enjoyed writing it. Stay tuned for my next post.&lt;/p&gt;
&lt;p&gt;For further reading i suggest the &lt;a href="http://zetcode.com/db/sqlitepythontutorial/"&gt;zetcode database tutorial&lt;/a&gt;.&lt;/p&gt;</summary>
    <category term="connect"/>
    <category term="database"/>
    <category term="delete"/>
    <category term="insert"/>
    <category term="python"/>
    <category term="update"/>
  </entry>
  <entry>
    <title>Give me an idea for an Ebook</title>
    <link href="http://yasoob.github.io/blog/give-me-an-idea-for-an-ebook" rel="alternate"/>
    <updated>2013-07-31T20:41:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-07-31:give-me-an-idea-for-an-ebook</id>
    <summary type="html">&lt;p&gt;Hi there fellas. Today i am going to ask you for a favour. I am going to
write an ebook about python. I want you to give me some ideas about what
i should write. This Ebook is going to be short. It will be between 10
to 20 pages because it's my first ebook. Currently i have&lt;!--more--&gt; two
topics in mind. The first one is to write an introductory ebook about
how to get started with python. This will be for beginners and will
include the installation and setting up of python as well as some
introductory tutorials. The other topic is to write about how i made the
&lt;a href="http://www.soundcloud-dl.appspot.com/"&gt;soundcloud searcher and downloader&lt;/a&gt; . All the backend programming of
soundcloud searcher and downloader is done in python. This ebook will
contain all the methods and resources I used to make this soundcloud
searcher and downloader as well as how I got it working on google app
engine. In my opinion the second topic will be more useful for you guys
as most of us are looking for these type of ebooks.&lt;/p&gt;
&lt;p&gt;What do you say ? If you want me to write about any other topic then do
tell me in the comments below and I will see.&lt;/p&gt;</summary>
    <category term="ebook"/>
    <category term="example"/>
    <category term="help"/>
    <category term="help me"/>
    <category term="tutorial"/>
  </entry>
  <entry>
    <title>10 python blogs worth following</title>
    <link href="http://yasoob.github.io/blog/10-python-blogs-worth-following" rel="alternate"/>
    <updated>2013-07-31T14:19:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-07-31:10-python-blogs-worth-following</id>
    <summary type="html">&lt;p&gt;Hi there fellow programmers. I remember those days when i started
learning python. I was always eager to find new blogs about python but
found just a handful of them. This is one of the reason i started this
blog.&lt;!--more--&gt; To spread my knowledge about python to other fellow
coders. Today i am going to try to provide you 10 links to different
python blogs that are worth following. By that i mean they are regularly
updated and have useful info. So here's the list:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; The first one is &lt;a href="http://planet.python.org/"&gt;Planet python&lt;/a&gt; undoubtedly one of the most
famous python blogs out there. Go check it out. I hope you will find it
helpful. It was last updated today.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; The second blog is &lt;a href="http://lucumr.pocoo.org/"&gt;lucumr&lt;/a&gt;. The home of the developer of flask
(a python micro web framework).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; The third blog is &lt;a href="http://love-python.blogspot.com/"&gt;love-python&lt;/a&gt;. I don't know how i stumbled
over it but i really like this blog as it has a lot of useful info and
code snippets.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; The fourth blog is of&lt;a href="http://doughellmann.com/"&gt;Doug Hellmann&lt;/a&gt;. He is the one behind
PYMOTW (Python Module Of The Week). This blog covers a lot of python
libraries. If you are searching for some new useful python libraries
then go check this out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5.&lt;/strong&gt; The next blog is &lt;a href="http://sayspy.blogspot.com/"&gt;Coder Who Says Py&lt;/a&gt;. It's a nice blog.
Although it's not regularly updated but still you will find some helpful
info in there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6.&lt;/strong&gt; The sixth blog is &lt;a href="http://effbot.org/"&gt;effbot&lt;/a&gt;. Full of helpful info, code snippets
and everything else you can expect from a python blog. Go check it out
before it's too late.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7.&lt;/strong&gt; The seventh blog is of the writer of "Two Scoops Of Django". It
is &lt;a href="http://pydanny.com/"&gt;pydanny&lt;/a&gt;. This is mainly about django but still a lot can be
learned from this blog.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8.&lt;/strong&gt; The next &lt;a href="http://inventwithpython.com/blog/"&gt;blog&lt;/a&gt; is of Al Sweigat. He is the writer of numerous
python books including his latest book "Hacking Secret Ciphers With
Python".&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9.&lt;/strong&gt; The ninth blog is &lt;a href="http://www.freepythontips.wordpress.com"&gt;this blog&lt;/a&gt; on which you currently are. This
is your all in one guide to python.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10.&lt;/strong&gt; The last blog is one of the most useful blog which got me up to
speed with python. It is called &lt;a href="http://www.blog.pythonlibrary.org/"&gt;Mouse Vs Python&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I hope you liked today's post and i am sure i helped you out of your
frustration of finding good python blogs. Do share your views in the
comments below and if you think that i have missed a blog then put it in
the comments as well.&lt;/p&gt;</summary>
    <category term="best"/>
    <category term="blogs"/>
    <category term="python"/>
    <category term="top 10"/>
    <category term="worth following"/>
  </entry>
  <entry>
    <title>20 Python libraries you can't live without</title>
    <link href="http://yasoob.github.io/blog/20-python-libraries-you-cant-live-without" rel="alternate"/>
    <updated>2013-07-30T23:44:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-07-30:20-python-libraries-you-cant-live-without</id>
    <summary type="html">&lt;p&gt;Hi there fellas. Today i am going to list 20 python libraries which have
been a part of my toolbelt and should be a part of yours as well. So
here they are&lt;!--more--&gt;:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; &lt;a href="http://www.python-requests.org"&gt;Requests&lt;/a&gt;. The most famous http library written by kenneth
reitz. It's a must have for every python developer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; &lt;a href="http://www.scrapy.org"&gt;Scrapy&lt;/a&gt;. If you are involved in webscraping then this is a
must have library for you. After using this library you won't use any
other.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; &lt;a href="http://wxpython.org/"&gt;wxPython&lt;/a&gt;. A gui toolkit for python. I have primarily used it
in place of tkinter. You will really love it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; &lt;a href="https://github.com/python-imaging/Pillow"&gt;Pillow&lt;/a&gt;. A friendly fork of PIL (Python Imaging Library). It
is more user friendly than PIL and is a must have for anyone who works
with images.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5.&lt;/strong&gt; &lt;a href="http://www.sqlalchemy.org/"&gt;SQLAlchemy&lt;/a&gt;. A database library. Many love it and many hate
it. The choice is yours.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6.&lt;/strong&gt; &lt;a href="http://www.crummy.com/software/BeautifulSoup/"&gt;BeautifulSoup&lt;/a&gt;. I know it's slow but this xml and html parsing
library is very useful for beginners.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7.&lt;/strong&gt; &lt;a href="http://twistedmatrix.com/"&gt;Twisted&lt;/a&gt;. The most important tool for any network application
developer. It has a very beautiful api and is used by a lot of famous
python developers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8.&lt;/strong&gt; &lt;a href="http://numpy.scipy.org//"&gt;NumPy&lt;/a&gt;. How can we leave this very important library ? It
provides some advance math functionalities to python.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9.&lt;/strong&gt; &lt;a href="http://www.scipy.org/"&gt;SciPy&lt;/a&gt;. When we talk about NumPy then we have to talk about
scipy. It is a library of algorithms and mathematical tools for python
and has caused many scientists to switch from ruby to python.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10.&lt;/strong&gt; &lt;a href="http://matplotlib.sourceforge.net/"&gt;matplotlib&lt;/a&gt;. A numerical plotting library. It is very useful
for any data scientist or any data analyzer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;11.&lt;/strong&gt; &lt;a href="http://www.pygame.org/news.html"&gt;Pygame&lt;/a&gt;. Which developer does not like to play games and
develop them ? This library will help you achieve your goal of 2d game
development.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;12.&lt;/strong&gt; &lt;a href="http://www.pyglet.org/"&gt;Pyglet&lt;/a&gt;. A 3d animation and game creation engine. This is the
engine in which the famous &lt;a href="https://github.com/fogleman/Minecraft"&gt;python port&lt;/a&gt; of minecraft was made&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;13.&lt;/strong&gt; &lt;a href="http://www.riverbankcomputing.co.uk/pyqt/"&gt;pyQT&lt;/a&gt;. A GUI toolkit for python. It is my second choice after
wxpython for developing GUI's for my python scripts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;14.&lt;/strong&gt; &lt;a href="http://www.pygtk.org/"&gt;pyGtk&lt;/a&gt;. Another python GUI library. It is the same library in
which the famous Bittorrent client is created.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;15.&lt;/strong&gt; &lt;a href="http://www.secdev.org/projects/scapy/"&gt;Scapy&lt;/a&gt;. A packet sniffer and analyzer for python made in
python.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;16.&lt;/strong&gt; &lt;a href="http://sourceforge.net/projects/pywin32/"&gt;pywin32&lt;/a&gt;. A python library which provides some useful methods
and classes for interacting with windows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;17.&lt;/strong&gt; &lt;a href="http://www.nltk.org/"&gt;nltk&lt;/a&gt;. Natural Language Toolkit – I realize most people won’t
be using this one, but it’s generic enough. It is a very useful library
if you want to manipulate strings. But it's capacity is beyond that. Do
check it out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;18.&lt;/strong&gt; &lt;a href="http://code.google.com/p/python-nose/"&gt;nose&lt;/a&gt;. A testing framework for python. It is used by millions
of python developers. It is a must have if you do test driven
development.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;19.&lt;/strong&gt; &lt;a href="http://code.google.com/p/sympy/"&gt;SymPy&lt;/a&gt;. SymPy can do algebraic evaluation, differentiation,
expansion, complex numbers, etc. It is contained in a pure Python
distribution.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;20.&lt;/strong&gt; &lt;a href="http://ipython.scipy.org/moin/"&gt;IPython&lt;/a&gt;. I just can’t stress enough how useful this tool is.
It is a python prompt on steroids. It has completion, history, shell
capabilities, and a lot more. Make sure that you take a look at it.&lt;/p&gt;
&lt;p&gt;I hope you liked today's post. Do share your views in the comments below
and if you think that i have missed an important library which should be
listed up there post it in the comments and i will add it. Stay tuned
for the next post.&lt;/p&gt;</summary>
    <category term="advance math"/>
    <category term="important"/>
    <category term="language"/>
    <category term="libraries"/>
    <category term="modules"/>
    <category term="most popular"/>
    <category term="must have"/>
    <category term="must have libraries"/>
    <category term="python"/>
    <category term="python libraries"/>
  </entry>
  <entry>
    <title>Targeting python 2 and 3 at the same time.</title>
    <link href="http://yasoob.github.io/blog/make-your-programs-compatible-with-python-2-and-3-at-the-same-time" rel="alternate"/>
    <updated>2013-07-30T19:58:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-07-30:make-your-programs-compatible-with-python-2-and-3-at-the-same-time</id>
    <summary type="html">&lt;p&gt;Hi there pythonistas. Today i am not going to write a lengthy tutorial
about how to make your programs compatible with python 2 and 3 at the
same time, but i am going to share a simple tip &lt;!--more--&gt;with you guys
which will help you achieve this target. Just imagine that you have a
very popular python module which is use by hundreds of people but not
all of them have python 2 or 3. In that case you have two choices. The
first one is to distribute 2 modules. One for python 2 and the other for
python 3 and the other choice is to modify your current code so that it
can be used with both python 2 and 3. I am going to talk about the
second choice. First tell me how you import packages in your script ?
Most of us do this :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;foo&lt;/span&gt;
&lt;span class="c"&gt;# or&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;foo&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;bar&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Do you know that you can do something like this as well?&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I know it's function is the same as above listed code but it is vital
for making your script compatible with python 2 and 3. Now examine the
code below :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;urllib.request&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;urllib_request&lt;/span&gt; &lt;span class="c"&gt;#for python 3&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ImportError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;urllib2&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;urllib_request&lt;/span&gt; &lt;span class="c"&gt;# for python 2&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Did you find something noteworthy in the above code ? So let me explain
the above code a little. We are wrapping our importing code in a try
except clause. Why are we doing that ? We are doing it because in
python2 there is no urllib.request module and will result in an
ImportError. The functionality of urllib.request is provided by urllib2
module in python2. So now when python2 try to import urllib.request and
get an import error we tell it to import urllib2 instead. The final
thing you need to know about is the &lt;code&gt;as&lt;/code&gt; keyword. It is mapping the
imported module to urllib_request. So that now all of the Classes and
methods of urllib2 are available to us by urllib_request.&lt;/p&gt;
&lt;p&gt;So how did this help us in targeting python 2 and 3 at the same time ?
Okay here is the trick. Once you have got a library that works in python
2 but is not available in python 3 then you have to find out it's
alternative in python 3 (most libraries have their alternatives for
python 3 but some don't). I know it's trivial and that is why a lot of
modules have still not been ported to python 3. After that you have to
wrap your module importing code in a try-except clause with a common
variable following the &lt;code&gt;as&lt;/code&gt; keyword. After that use the imported module.
Here is a complete example which should work both in python 2 and 3:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;urllib.request&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;compat_urllib_request&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ImportError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c"&gt;# Python 2&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;urllib2&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;compat_urllib_request&lt;/span&gt;
&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;compat_urllib_request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://www.google.com/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;content-type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="s"&gt;&amp;#39;text/html; charset=ISO-8859-1&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Another example which involves the json library:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;json&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ImportError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;simplejson&lt;/span&gt; &lt;span class="kn"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;json&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I hope you liked today's post. Stay tuned for the next one. If you have
any suggestions then do post them in the comments below.&lt;/p&gt;</summary>
    <category term="compatibility"/>
    <category term="language"/>
    <category term="programming"/>
    <category term="python"/>
    <category term="python 2"/>
    <category term="python 3"/>
    <category term="support"/>
    <category term="targeting"/>
  </entry>
  <entry>
    <title>Exception handling</title>
    <link href="http://yasoob.github.io/blog/exception-handling" rel="alternate"/>
    <updated>2013-07-30T02:03:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-07-30:exception-handling</id>
    <summary type="html">&lt;p&gt;Okay so the chances are you already know about exception handling in
python but some new programmers don't. How do you handle exceptions in
python ? First let me tell you what exceptions are. Exceptions are when
something unexpected happens&lt;!--more--&gt; with your code. Just think that
you writing a huge program which browses the internet and accesses web
pages, the program works fine on your side and you consider packaging
and distributing it. But something unexpected occurs on the pc of the
user who downloaded your package from the internet and tried to run it.
His internet connection dropped. What will happen ?&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urllib2&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;urllib2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;http://www.google.com/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="k"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; 
    &lt;span class="n"&gt;urllib2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;http://www.google.com/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;C:\Python27\lib\urllib2.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;urlopen&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_opener&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;C:\Python27\lib\urllib2.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;C:\Python27\lib\urllib2.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;422&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_open&lt;/span&gt;
    &lt;span class="s"&gt;&amp;#39;_open&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;C:\Python27\lib\urllib2.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;382&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_call_chain&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;C:\Python27\lib\urllib2.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1214&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;http_open&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;do_open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;httplib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HTTPConnection&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;C:\Python27\lib\urllib2.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1184&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;do_open&lt;/span&gt;
    &lt;span class="n"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;URLError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So in order to save yourself from this you have to use
&lt;code&gt;Exception Handling&lt;/code&gt;. There are three keywords available within python
which help you to handle exceptions. They are usually referred to as
&lt;code&gt;try-except&lt;/code&gt; clause. Just watch the below code.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;try:&lt;/span&gt;
    &lt;span class="n"&gt;urllib2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;http://www.google.com/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;except&lt;/span&gt; &lt;span class="n"&gt;urllib2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;URLError&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;An error &amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;An&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Here we are doing the same thing but using the try except clause. Lets
get somewhat deeper into it. We wrap our main code in the try clause.
After that we wrap some code in except clause which gets executed if an
exception occurs in the code wrapped in try clause. But wait where is
the third keyword ? The third keyword is &lt;code&gt;finally&lt;/code&gt;. It comes after the
except clause and gets executed even if no exception occurs. Let me show
you the same example but this time with the finally clause as well.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;try:&lt;/span&gt;
    &lt;span class="n"&gt;urllib2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;http://www.google.com/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;except&lt;/span&gt; &lt;span class="n"&gt;urllib2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;URLError&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;An error %s &amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;%e&lt;/span&gt;
&lt;span class="n"&gt;finally:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;This is going to be printed even if no exception occurs&amp;quot;&lt;/span&gt;

&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;Google&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;nwindow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;google&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;kEI:&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;sdD2UbmEOMzBtAbyqYCgDQ&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="ow"&gt;ge&lt;/span&gt;

&lt;span class="o"&gt;------------------------&lt;/span&gt;&lt;span class="n"&gt;trancuated&lt;/span&gt;&lt;span class="o"&gt;-------------------&lt;/span&gt; 
&lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;going&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;printed&lt;/span&gt; &lt;span class="n"&gt;even&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;no&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt; &lt;span class="n"&gt;occurs&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So as you can see the finally clause got executed even when there was no
exception. Okay now i am going to tell you a little secret which most of
us don't know and even i got to know it just few days ago. While using
the except clause if we want to handle any exception that we are not
aware of then what should we do ? Here in this situation we can put more
except clauses for each exception which is likely to occur and in the
end we can put another except clause which caches all exceptions which
were not likely to occur. Here is an example :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;try:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;ali&lt;/span&gt;
&lt;span class="n"&gt;except&lt;/span&gt; &lt;span class="n"&gt;KeyboardInterrupt:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;#39;E&amp;#39;s pining!&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;except&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;This is going to handle every type of exception&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;finally:&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;okay the end&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;going&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt; &lt;span class="n"&gt;every&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt;
&lt;span class="n"&gt;okay&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Okay i guess thats it for now. However i just gave you an intro of
exception handling in python and if you want to study further then go to
&lt;a href="http://docs.python.org/2/tutorial/errors.html"&gt;this&lt;/a&gt; link. I hope you liked today's post. Do share your views about
todays post in the comments below.&lt;/p&gt;
&lt;p&gt;Source : http://docs.python.org/2/tutorial/errors.html&lt;/p&gt;</summary>
    <category term="error handling"/>
    <category term="errors"/>
    <category term="exceptions"/>
    <category term="python"/>
    <category term="try except"/>
  </entry>
  <entry>
    <title>Python install location and version</title>
    <link href="http://yasoob.github.io/blog/python-install-location-and-version" rel="alternate"/>
    <updated>2013-07-30T00:17:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-07-30:python-install-location-and-version</id>
    <summary type="html">&lt;p&gt;Have you ever wondered how to check the install path of python and it's
version ? If you have then this post is for you. It is very easy to
check the version and install location of python on linux as well as on
windows.&lt;!--more--&gt; First I will show the method of checking this on
linux and then on windows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; On linux just type these two commands in the terminal:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;# for python install path&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@bt:&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;which&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt;
&lt;span class="sr"&gt;/usr/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;

&lt;span class="c1"&gt;# for python version;&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@bt:&lt;/span&gt;&lt;span class="sr"&gt;/usr/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;python&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;V&lt;/span&gt;
&lt;span class="n"&gt;Python&lt;/span&gt; &lt;span class="mf"&gt;2.7.5&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; On windows type this commands in the command prompt for python
version:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;V&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And type these commands in the python shell for python install path&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;executable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="s"&gt;&amp;#39;C:\\Python27&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This comes in handy when you need to know the version and path of python
real quick. I hope you liked today's post. Stay tuned for the next one.
Do share your views in the comments below.&lt;/p&gt;</summary>
    <category term="installation"/>
    <category term="location"/>
    <category term="path"/>
    <category term="programing"/>
    <category term="python"/>
    <category term="version"/>
  </entry>
  <entry>
    <title>Coding styles for python</title>
    <link href="http://yasoob.github.io/blog/coding-styles-for-python" rel="alternate"/>
    <updated>2013-07-29T20:08:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-07-29:coding-styles-for-python</id>
    <summary type="html">&lt;p&gt;Yet another useful post and this one is about coding styles in python.
Everyone has his own coding style in python. Here i am going to post
some links that will help you to choose your own coding style in
python.&lt;!--more--&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The first link is undoubtedly from the &lt;strong&gt;official python
documentation&lt;/strong&gt; as python documentation has everything to get you
started. This link will teach you how to use python and how &lt;strong&gt;not&lt;/strong&gt; to
use python.&lt;br /&gt;
&lt;code&gt;http://docs.python.org/2/howto/doanddont.html&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The second link is from the famous &lt;strong&gt;PEP-8&lt;/strong&gt; which is python's
official style guide. It determines the python's official coding
standards. You should definitely take a look at them and try to
incorporate them in your code.&lt;br /&gt;
&lt;code&gt;http://www.python.org/dev/peps/pep-0008/&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The third link is from &lt;strong&gt;google&lt;/strong&gt; because as you know google is a
huge user of python and most of their infrastructure is based on python
as is their online support forum. So it's not surprising that google has
it's own style guide for python.&lt;br /&gt;
&lt;code&gt;http://google-styleguide.googlecode.com/svn/trunk/pyguide.html&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So the last link is from &lt;strong&gt;khanacademy&lt;/strong&gt;. As you know it's the
biggest online academy and whole of their online infrastructure is based
on python. I really love their python style guide.&lt;br /&gt;
&lt;code&gt;https://sites.google.com/a/khanacademy.org/forge/for-developers/styleguide/python&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I hope you liked this post. Do share your views in the comments below.&lt;/p&gt;</summary>
    <category term="code"/>
    <category term="coding style"/>
    <category term="important"/>
    <category term="python"/>
    <category term="python language"/>
    <category term="style"/>
    <category term="style guide"/>
  </entry>
  <entry>
    <title>Setting up python on windows</title>
    <link href="http://yasoob.github.io/blog/setting-up-python-on-windows" rel="alternate"/>
    <updated>2013-07-29T16:44:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-07-29:setting-up-python-on-windows</id>
    <summary type="html">&lt;p&gt;Hi there pythonistas. Most of the new python programmers don't know how
to correctly install python on windows. Today I am going to share clean
and clear instructions on how to install &lt;!--more--&gt;python on a Windows
7 machine. There are only 4 steps involved so without wasting a minute
lets get started.  &lt;/p&gt;
&lt;p&gt;&lt;code&gt;1. Visit the official Python download page and grab the Windows installer. Choose the 32-bit version. (A 64-bit version is available, but there are compatibility issues with some modules you may want to install later.)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Python currently exists in two versions. One is 2.xx version
and the other is 3.xx version. In this post i am going to focus only on
2.xx version as it is more widely used right now and some modules don't
support 3.xx version as yet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; Run the installer and accept all the default settings. Don't
change the default directory it creates.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; Now comes the trickiest part. We have to add python to our
environment variable. You do not have to understand what environment
variable is. Just follow along with me. We set the system’s PATH
variable to include directories that include Python components and
packages so that they are available in the command prompt. Without doing
this we won't be able to use python from command line. To do this:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Right-click Computer and select Properties.&lt;/li&gt;
&lt;li&gt;In the dialog box, select Advanced Â System Settings.&lt;/li&gt;
&lt;li&gt;In the next dialog, select Environment Variables.&lt;/li&gt;
&lt;li&gt;In the User Variables section, edit the PATH statement to include
    this:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;C:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Python27&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;C:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Python27&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Lib&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;C:&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Python27&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;Scripts&lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;4. Now, you can open a command prompt (Start Menu|Accessories or Start Menu|Run|cmd) and type:&lt;/code&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;C:&lt;/span&gt;&lt;span class="o"&gt;\&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;That will load the Python interpreter:&lt;/code&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;Python&lt;/span&gt; &lt;span class="mf"&gt;2.7.3&lt;/span&gt;  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Apr&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="mi"&gt;2012&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MSC&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="mf"&gt;.1500&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt; &lt;span class="n"&gt;bit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Intel&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;win32&lt;/span&gt;
&lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;help&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;copyright&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;credits&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;license&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;more&lt;/span&gt; &lt;span class="n"&gt;information&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;/code&gt;&lt;br /&gt;
Just because of the changes that you did to the path variable you are
now able to use python from command prompt. Now press Control-Z to exit
the interpreter and get back to a C: prompt.&lt;/p&gt;
&lt;p&gt;Till now the the installation of python is complete but you may want to
install &lt;a href="http://pypi.python.org/pypi/setuptools"&gt;setuptools&lt;/a&gt; which offers the helpful &lt;a&gt;easy_install&lt;/a&gt;
utility for installing Python packages. Grab the appropriate version for
your system and install and that's it for now. Stay tuned for the next
post.&lt;/p&gt;</summary>
    <category term="download"/>
    <category term="path variable"/>
    <category term="python"/>
    <category term="setting up python"/>
    <category term="setuptools"/>
    <category term="windows"/>
  </entry>
  <entry>
    <title>Packaging your python scripts.</title>
    <link href="http://yasoob.github.io/blog/packaging-your-python-scripts" rel="alternate"/>
    <updated>2013-07-29T14:42:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-07-29:packaging-your-python-scripts</id>
    <summary type="html">&lt;p&gt;Oh hi there! Welcome to another useful post. This post is going to be about how to package your python scripts and packages for distribution on PyPI or some other place.&lt;!--more--&gt;Here I won't go too deep into explaining everything as most of us just need to know the basics of packaging. However i will provide you with different links for further study. Okay lets talk about&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; setuptools&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;first. What is it ? It's a Python module which allows us to easily package our python scripts and modules for distribution. However there are other packaging libraries as well but here i will talk about setuptools only.&lt;/p&gt;
&lt;p&gt;So what should be the basic example to show the usage of setuptools ? Here you go. For basic use of setuptools, just import things from setuptools and then look below for the minimal setup script using setuptools.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;setuptools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;find_packages&lt;/span&gt;
&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;HelloWorld&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;0.1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;packages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;find_packages&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;As you see we don't have to specify much in order to use setuptools in a project. Just by doing the above, this project will be able to produce eggs, upload to PyPI, and automatically include all packages in the directory where the setup.py lives. But when you are releasing your projects on PyPI then you should add a bit more information about yourself and this package and if your project relies on some external dependencies then list them there as well. Here is another script which can do all that :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;setuptools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;find_packages&lt;/span&gt;
&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;HelloWorld&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;0.1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;packages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;find_packages&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;scripts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;say_hello.py&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;

    &lt;span class="c"&gt;# Project uses reStructuredText, so ensure that the &lt;/span&gt;
    &lt;span class="c"&gt;# docutils get installed or upgraded on the target &lt;/span&gt;
    &lt;span class="c"&gt;# machine&lt;/span&gt;
    &lt;span class="n"&gt;install_requires&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;docutils&amp;gt;=0.3&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;

    &lt;span class="n"&gt;package_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;# If any package contains *.txt or *.rst files,&lt;/span&gt;
        &lt;span class="c"&gt;# include them:&lt;/span&gt;
        &lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*.txt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;*.rst&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="c"&gt;# And include any *.msg files found in the &lt;/span&gt;
        &lt;span class="c"&gt;# &amp;#39;hello&amp;#39; package, too:&lt;/span&gt;
        &lt;span class="s"&gt;&amp;#39;hello&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;*.msg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;

    &lt;span class="c"&gt;# metadata for upload to PyPI&lt;/span&gt;
    &lt;span class="n"&gt;author&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;Me&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;author_email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;me@example.com&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;This is an Example Package&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;license&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;PSF&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;keywords&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;hello world example examples&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c"&gt;# project home page, if any :&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;http://example.com/HelloWorld/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="c"&gt;# could also include long_description, download_url,&lt;/span&gt;
    &lt;span class="c"&gt;# classifiers, etc.&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I hope this is enough for now. However here are some other packaging libraries in case you were wondering :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Distutils is the standard tool used for packaging. It works rather well for simple needs, but is limited and not trivial to extend.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Setuptools is a project born from the desire to fill missing distutils functionality and explore new directions. In some sub-communities, it’s a de facto standard. It uses monkey-patching and magic that is frowned upon by Python core developers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Distribute is a fork of Setuptools that was started by developers feeling that its development pace was too slow and that it was not possible to evolve it. Its development was considerably slowed when distutils2 was started by the same group.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Distutils2 is a new distutils library, started as a fork of the distutils codebase, with good ideas taken from setup tools (of which some were thoroughly discussed in PEPs), and a basic installer inspired by pip. Distutils2 did not make the Python 3.3 release, and it was put on hold.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://stackoverflow.com/questions/6344076/differences-between-distribute-distutils-setuptools-and-distutils2"&gt;&amp;gt;&amp;gt;&amp;gt; source&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For further study i recommend: http://pythonhosted.org/distribute/setuptools.html&lt;/p&gt;</summary>
    <category term="distribute"/>
    <category term="distutils"/>
    <category term="packaging"/>
    <category term="pypi"/>
    <category term="python"/>
    <category term="scripts"/>
    <category term="setuptools"/>
  </entry>
  <entry>
    <title>Dictionaries have a get() method</title>
    <link href="http://yasoob.github.io/blog/dictionaries-have-a-get-method" rel="alternate"/>
    <updated>2013-07-29T00:59:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-07-29:dictionaries-have-a-get-method</id>
    <summary type="html">&lt;p&gt;Okay here we are with yet another post. However this post is going to be
short as in this post i am going to teach you a small, simple and very
useful trick. Have you ever tried to access a value from a
&lt;!--more--&gt;dictionary and got an exception that there is no value mapped
to that key ? Like this :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;key1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;key2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;key1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;key3&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="k"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; 
    &lt;span class="n"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;key3&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;KeyError:&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;key3&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Sometimes you do not want anything like this because this error can
break your whole program and make it useless until you fix this issue.
Is there any way through which we can see if a key is present in a
dictionary or not and if it is not present then get a default value in
it's place ? the chances are that you don't know of any such method.
Okay so here's the trick. Just examine the code below and i will explain
it later.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;key1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;key2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;key1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dict&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;key3&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;
So what is happening above ? We are still accessing the same key but
where has the exception gone ? Let me introduce you to get() method
which is available with a dictionary. What this method does is that it
allows you to specify a default value which is returned in case the key
is not present in the dictionary. In our case there is no

    key3

&lt;p&gt;
in our dict but when we are using the get() method we are specifying the
default value which should be returned in case if key3 is not present
and the default value which i have set is 0. The syntax of the get
method is :

    dict.get('anykey','the default value to return if the key is not present')

. However if we do not set a default value then this returns `None` if
the key is not present. I hope it's enough for you guys however if you
want to further explore this get() method then google is your friend.

Do share your views in the comments below.</summary>
    <category term="default"/>
    <category term="dict"/>
    <category term="dictionaries"/>
    <category term="get()"/>
    <category term="python"/>
    <category term="software"/>
  </entry>
  <entry>
    <title>The use of return and global keywords.</title>
    <link href="http://yasoob.github.io/blog/the-use-of-return-and-global-keywords" rel="alternate"/>
    <updated>2013-07-28T23:52:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-07-28:the-use-of-return-and-global-keywords</id>
    <summary type="html">&lt;p&gt;Okay so here we have another post. This post is about the return
keyword. you might have encountered some functions written in python
which have a return keyword in the end of the function. Do you know what
it does ?&lt;!--more--&gt; Lets examine this little function:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;value2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;value1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;value2&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;span class="mi"&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The function above takes two values as input and then output their
addition. We could have also done:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;value2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;     &lt;span class="n"&gt;global&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;     &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;value2&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;span class="mi"&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So first lets talk about the first bit of code which involves the return
keyword. What that function is doing is that it is assigning the value
to the variable which is calling that function which in our case is
&lt;code&gt;result&lt;/code&gt;.&lt;br /&gt;
It's pretty handy in most cases and you won't need to use the global
keyword. However lets examine the other bit of code as well which
includes the global keyword. So what that function is doing is that it
is making a global variable result. What does global mean here ? Global
variable means that we can access that variable outside the function as
well. Let me demonstrate it with an example :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;# first without the global variable&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;value2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;value2&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;

&lt;span class="c1"&gt;# Oh crap we encountered an exception. Why is it so ?&lt;/span&gt;
&lt;span class="c1"&gt;# the python interpreter is telling us that we do not &lt;/span&gt;
&lt;span class="c1"&gt;# have any variable with the name of result. It is so &lt;/span&gt;
&lt;span class="c1"&gt;# because the result variable is only accessible inside &lt;/span&gt;
&lt;span class="c1"&gt;# the function in which it is created if it is not global.&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="k"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; 
    &lt;span class="n"&gt;result&lt;/span&gt;
&lt;span class="n"&gt;NameError:&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;result&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nb"&gt;defined&lt;/span&gt;

&lt;span class="c1"&gt;# Now lets run the same code but after making the result &lt;/span&gt;
&lt;span class="c1"&gt;# variable global&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;value2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;global&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;value2&lt;/span&gt;


&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;span class="mi"&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So hopefully there were no errors in the second run as expected. If you
want to further explore them you should check out the following links.&lt;br /&gt;
1. &lt;a
href="http://stackoverflow.com/questions/3359204/python-assign-global-variable-to-function-return-requires-function-to-be-globa"Stackoverflow&lt;/a&gt;&lt;br /&gt;
2. &lt;a href="http://stackoverflow.com/questions/3052793/python-output-from-functions?lq=1"&gt;Stackoverflow&lt;/a&gt;&lt;/p&gt;</summary>
    <category term="functions"/>
    <category term="global"/>
    <category term="output"/>
    <category term="python"/>
    <category term="return"/>
  </entry>
  <entry>
    <title>Generating a random string.</title>
    <link href="http://yasoob.github.io/blog/generating-a-random-string" rel="alternate"/>
    <updated>2013-07-28T17:40:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-07-28:generating-a-random-string</id>
    <summary type="html">&lt;p&gt;Okay so most of us do not know how to generate random strings which
include letters and digits. This can be really useful for generating a
password or something else just use your evil mind. Okay so how do
we&lt;!--more--&gt; generate a random string. Have you ever heard of the
string module available in python ? The chances are that you have not
heard about it. So what does this module provide us ? Okay here you go
lets understand this module by example:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="c1"&gt;# first we have to import random module as this&lt;/span&gt;
&lt;span class="c1"&gt;# provides the backbone for our random string&lt;/span&gt;
&lt;span class="c1"&gt;# generator and then we have to import the string&lt;/span&gt;
&lt;span class="c1"&gt;# module.&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;

&lt;span class="c1"&gt;# now lets see what this string module provide us.&lt;/span&gt;
&lt;span class="c1"&gt;# I wont be going into depth because the python&lt;/span&gt;
&lt;span class="c1"&gt;# documentation provides ample information.&lt;/span&gt;
&lt;span class="c1"&gt;# so lets generate a random string with 32 characters.&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ascii_letters&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;digits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;xrange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;
&lt;span class="s"&gt;&amp;#39;9fAgMmc9hl6VXIsFu3ddb5MJ2U86qEad&amp;#39;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;32&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Another example with a function:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;def&lt;/span&gt; &lt;span class="n"&gt;random_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chars&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ascii_uppercase&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;digits&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chars&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;random_generator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="s"&gt;&amp;#39;G5G74W&amp;#39;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;random_generator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;quot;6793YUIO&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="s"&gt;&amp;#39;Y3U&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So thats it for now. If you want to further explore the string module
then go to the official &lt;a href="http://docs.python.org/2/library/string.html"&gt;documentation&lt;/a&gt;&lt;/p&gt;</summary>
    <category term="python"/>
    <category term="random"/>
    <category term="string"/>
  </entry>
  <entry>
    <title>What is __init__.py ?</title>
    <link href="http://yasoob.github.io/blog/what-is-__init__-py" rel="alternate"/>
    <updated>2013-07-28T16:00:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-07-28:what-is-__init__-py</id>
    <summary type="html">&lt;p&gt;Okay yet another useful post. This post is really important and useful
for anyone just starting out with python. So what is the &lt;code&gt;__init__.py&lt;/code&gt;
file ?&lt;!--more--&gt;&lt;/p&gt;
&lt;p&gt;Files name __init__.py are used to mark directories on disk as
Python package directories. If you have the files&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;mydir&lt;/span&gt;&lt;span class="sr"&gt;/spam/&lt;/span&gt;&lt;span class="n"&gt;__init__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;midir&lt;/span&gt;&lt;span class="sr"&gt;/spam/mo&lt;/span&gt;&lt;span class="n"&gt;dule&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;and mydir is on your path, you can import the code in module.py as&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;spam&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;or&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;spam&lt;/span&gt; &lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If you remove the __init__.py file, Python will no longer look for
submodules inside that directory, so attempts to import the module will
fail.&lt;/p&gt;
&lt;p&gt;The __init__.py file is usually empty, but can be used to export
selected portions of the package under more convenient name, hold
convenience functions, etc. Given the example above, the contents of the
init module can be accessed as&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nb"&gt;import&lt;/span&gt; &lt;span class="n"&gt;spam&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And finally here is what the official &lt;a href="http://docs.python.org/tutorial/modules.html#packages"&gt;documentation&lt;/a&gt; has to say about
this file:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;__init__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt; &lt;span class="n"&gt;Python&lt;/span&gt; &lt;span class="n"&gt;treat&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; 
&lt;span class="n"&gt;directories&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;containing&lt;/span&gt; &lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;prevent&lt;/span&gt; 
&lt;span class="n"&gt;directories&lt;/span&gt; &lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;common&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;such&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; 
&lt;span class="n"&gt;unintentionally&lt;/span&gt; &lt;span class="n"&gt;hiding&lt;/span&gt; &lt;span class="n"&gt;valid&lt;/span&gt; &lt;span class="n"&gt;modules&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="n"&gt;occur&lt;/span&gt; &lt;span class="n"&gt;later&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt;
&lt;span class="n"&gt;module&lt;/span&gt; &lt;span class="n"&gt;search&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;simplest&lt;/span&gt; &lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;__init__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;just&lt;/span&gt;
&lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;empty&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;but&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;also&lt;/span&gt; &lt;span class="n"&gt;execute&lt;/span&gt; &lt;span class="n"&gt;initialization&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="nb"&gt;package&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;__all__&lt;/span&gt; &lt;span class="n"&gt;variable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;described&lt;/span&gt; &lt;span class="n"&gt;later&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Source : http://effbot.org/pyfaq/what-is-init-py-used-for.htm&lt;/p&gt;</summary>
    <category term="programming"/>
    <category term="python"/>
    <category term="__init__.py"/>
  </entry>
  <entry>
    <title>The with statement</title>
    <link href="http://yasoob.github.io/blog/the-with-statement" rel="alternate"/>
    <updated>2013-07-28T15:23:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-07-28:the-with-statement</id>
    <summary type="html">&lt;p&gt;So the chances are that you already know about the with statement but
some of us do not know about it. Lets face the reality the with
statement saves us a lot of time and reduces our code base. Just
imagine&lt;!--more--&gt; you are opening a file width python and then saving
something to it. You would normally do :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;freepythontips.wordpress.com&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;But what if an exception occurs while writing to file ? then the file
won't be closed properly. I know how much trouble it can cause. It once
happened with me that i was running a web scrapper and it was running
for past three hours and then unexpectedly an exception occured and my
whole csv file got corrupted and i had to run the scrapper again. So
lets come to the point. What method can you adopt to prevent such
disaster. Obviously you can not prevent the exception when it is
unexpected but you can take some precautions. Firstly you can wrap up
your code in a try-except clause or better yet you can use a with
statement. Let's first talk about try-except clause. You would normally
do something like this :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="err"&gt;try:&lt;/span&gt;
    &lt;span class="err"&gt;file&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="err"&gt;open(&amp;#39;file.txt&amp;#39;,&amp;#39;w&amp;#39;)&lt;/span&gt;
    &lt;span class="err"&gt;file.write(data)&lt;/span&gt;
&lt;span class="err"&gt;except:&lt;/span&gt;
    &lt;span class="cp"&gt;# do something in case of an exception&lt;/span&gt;
&lt;span class="err"&gt;finally:&lt;/span&gt;
    &lt;span class="cp"&gt;# here comes the trick. The finally clause gets &lt;/span&gt;
    &lt;span class="cp"&gt;# executed even if an exception occured in try &lt;/span&gt;
    &lt;span class="cp"&gt;# or except clause. now we can safely close this&lt;/span&gt;
    &lt;span class="cp"&gt;# file.&lt;/span&gt;
    &lt;span class="err"&gt;file.close()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now lets talk about the with statement. While using a with statement you
would normally do:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;file.txt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;as&lt;/span&gt; &lt;span class="n"&gt;file:&lt;/span&gt;
    &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Okay so here while using the with statement we do not have to close the
file explicitly. It is automatically closed after the data is written to
the file.&lt;/p&gt;
&lt;p&gt;Do share your views about this post below in the comments.&lt;/p&gt;</summary>
    <category term="python"/>
    <category term="with"/>
    <category term="with statement"/>
  </entry>
  <entry>
    <title>A simple python server</title>
    <link href="http://yasoob.github.io/blog/a-simple-python-server" rel="alternate"/>
    <updated>2013-07-28T02:25:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-07-28:a-simple-python-server</id>
    <summary type="html">&lt;p&gt;I guess it's not a simple python server. It is really simple and easy to
deploy python server. Just imagine you want to share a folder on your pc
with someone on your network. What you will do ?&lt;!--more--&gt; Obviously
you will start the sharing service but what if you have python installed
and want an easier solution ? Here you go. You can just type in :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nv"&gt;$&lt;/span&gt; &lt;span class="nv"&gt;python&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;SimpleHTTPServer&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This should be typed in the terminal or command prompt if you are a
windows guy. Just open command prompt. Navigate to the directory which
you want to share and then run this command. Unlike the normal sharing
services this server will also show you the IP addresses of the PCs
which are accessing that folder. Pretty slick right ?&lt;/p&gt;
&lt;p&gt;Do share your views about this post below in the comments.&lt;/p&gt;</summary>
  </entry>
  <entry>
    <title>In-place value swapping</title>
    <link href="http://yasoob.github.io/blog/in-place-value-swapping" rel="alternate"/>
    <updated>2013-07-28T02:08:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-07-28:in-place-value-swapping</id>
    <summary type="html">&lt;p&gt;Okay so this is kinda new for some of us. If you are a seasoned
programmer then this might not be surprising for you but if you are a
new programmer then this is something you really need to know. Okay so
here we go. &lt;!--more--&gt;In normal situations if you would want to swap
the values of two variables then this would be something you would go
after :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;But there's a more simple method which will merely take three lines.
Here it is :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This is surely a simple way to swap values. Do comment below and tell me
your views about this.&lt;/p&gt;</summary>
  </entry>
  <entry>
    <title>The beginning of a new blog.</title>
    <link href="http://yasoob.github.io/blog/welcome" rel="alternate"/>
    <updated>2013-07-28T01:29:00-04:00</updated>
    <author>
      <name>yasoob008</name>
    </author>
    <id>tag:yasoob.github.io/blog,2013-07-28:welcome</id>
    <summary type="html">&lt;p&gt;Hi there, Today i am beginning my very own personal blog related to
python. Let me first tell you who i am. I am a computer programmer from
Pakistan. I have made a lot open source contributions. I have
contributed mainly to youtube-dl.&lt;!--more--&gt;It's a python script which
allows you to download videos from various websites like youtube,
facebook, dailymotion, metacafe, etc . I also run a website with the
name of http://www.soundcloud-dl.appspot.com/ It allows you to search
and download music from soundcloud.com . I know that sounds cool :D . I
have done all of it's backend programming in python. I also have some
useful scripts on my github page and if you would like to check them out
then you are most welcome. This blog will serve you new python tips
every other day. This blog is not for seasoned programmers but those who
are starting out with python or want to enhance their knowledge about
this language. lastly if you have any comments, suggestions or want my
help with something then feel free to email me on yasoob.khld@gmail.com
. I guess now it's time to say goodbye.&lt;/p&gt;</summary>
  </entry>
</feed>
