Skip to content

Commit

Permalink
Add Code snippets tutorial.
Browse files Browse the repository at this point in the history
Signed-off-by: Joshua Roesslein <jroesslein@gmail.com>
  • Loading branch information
kumanna authored and joshthecoder committed Dec 8, 2009
1 parent 7d46200 commit 2998332
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 0 deletions.
93 changes: 93 additions & 0 deletions doc/cursor_tutorial.rst
@@ -0,0 +1,93 @@
.. _cursor_tutorial:

***************
Cursor Tutorial
***************

This tutorial describes details on pagination with Cursor objects.

Introduction
============

We use pagination a lot in Twitter API development. Iterating through
timelines, user lists, direct messages, etc. In order to perform
pagination we must supply a page/cursor parameter with each of our
requests. The problem here is this requires a lot of boiler plate code
just to mange the pagination loop. To help mage pagination easier and
require less code Tweepy has the Cursor object.

Old way vs Cursor way
---------------------

First let's demonstrate iterating the statues in the authenticated
user's timeline. Here is how we would do it the "old way" before
Cursor object was introduced::

page = 1
while True:
statuses = api.user_timeline(page=page)
if statuses:
for status in statuses:
# process status here
process_status(status)
else:
# All done
break
page += 1 # next page

As you can see we must manage the "page" parameter manually in our
pagination loop. Now here is the version of the code using Cursor
object::

for status in Cursor(api.user_timeline).items():
# process status here
process_status(status)

Now that looks much better! Cursor handles all the pagination work for
us behind the scene so our code can now focus entirely on processing
the results.

Passing parameters into the API method
--------------------------------------

What if you need to pass in parameters to the API method?

.. code-block :: python
api.user_timeline(id="twitter")
Since we pass Cursor the callable, we can not pass the parameters
directly into the method. Instead we pass the parameters into the
Cursor constructor method::

Cursor(api.user_timeline, id="twitter")

Now Cursor will pass the parameter into the method for us when ever it
makes a request.

Items or Pages
--------------

So far we have just demonstrated pagination iterating per an
item. What if instead you want to process per a page of results? You
would use the pages() method::

for page in Cursor(api.user_timeline).pages():
# page is a list of statuses
process_page(page)


Limits
------

What if you only want n items or pages returned? You pass into the items() or pages() methods the limit you want to impose.

.. code-block :: python
# Only iterate through the first 200 statuses
for status in Cursor(api.user_timeline).limit(200):
process_status(status)
# Only iterate through the first 3 pages
for page in Cursor(api.user_timeline).pages(3):
process_page(page)
1 change: 1 addition & 0 deletions doc/index.rst
Expand Up @@ -14,6 +14,7 @@ Contents:
getting_started.rst
auth_tutorial.rst
code_snippet.rst
cursor_tutorial.rst
api.rst

Indices and tables
Expand Down

0 comments on commit 2998332

Please sign in to comment.