Files
python-for-humans/3_proposal/0_proposal.md
T
Kenneth Reitz 56ff7221b5 snapshot
2011-10-06 19:55:13 -04:00

3.0 KiB
Raw Blame History

!SLIDE bullets incremental

This is a serious problem.

!SLIDE bullets incremental

The Solution is Simple.

  • Build elegant tools to perform these tasks.
  • Provide a real resource for learning.

!SLIDE

Python needs more Pragmatic Packages.

!SLIDE dark

pra•gmat•ic |pragˈmatik|, adj:

Dealing with things sensibly and realistically in a way that is based on practical rather than theoretical considerations.

!SLIDE

An Examples.

Let's mess around. Maybe play with the GitHub API?

!SLIDE

!SLIDE small code

@@@ ruby
require 'net/http'
require 'uri'

uri = URI.parse('https://api.github.com/user')

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

req = Net::HTTP::Get.new(uri.request_uri)
req.basic_auth('username', 'password')

r = http.request(req)

puts r

Let's port this to Python.

!SLIDE smaller code execute

Python (hours later).

@@@ python
import urllib2

gh_url = 'https://api.github.com/user'

req = urllib2.Request(gh_url)

password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_manager.add_password(None, gh_url, 'user', 'pass')

auth_manager = urllib2.HTTPBasicAuthHandler(password_manager)
opener = urllib2.build_opener(auth_manager)

urllib2.install_opener(opener)

handler = urllib2.urlopen(req)

print handler.read()

!SLIDE smaller code execute #I lied — there's more!

@@@ python

import re

class HTTPForcedBasicAuthHandler(HTTPBasicAuthHandler):

    auth_header = 'Authorization'
    rx = re.compile('(?:.*,)*[ \t]*([^ \t]+)[ \t]+'
                    'realm=(["\'])(.*?)\\2', re.I)

    def __init__(self,  *args, **kwargs):
        HTTPBasicAuthHandler.__init__(self, *args, **kwargs)s

    def http_error_401(self, req, fp, code, msg, headers):
        url = req.get_full_url()
        response = self._http_error_auth_reqed(
            'www-authenticate', url, req, headers)
        self.reset_retry_count()
        return response

    http_error_404 = http_error_401

!SLIDE

Admit it.

If this was you, you'd leave Python and never come back.

!SLIDE

Break it down.

!SLIDE

Enter Requests.

!SLIDE

The Codez, they are ugleh.

[trollface or something]

!SLIDE

Unless there's an explicit requirement,

a student should never see urllib2.

No excuses.

!SLIDE

Pragmatic Package.

@@@ python
import requests

url = 'https://api.github.com/user'
auth = ('username', 'password')

r = requests.get(url, auth=auth)
print r.content

!SLIDE

Fit the 90% Use Case.

!SLIDE

The API is all that matters.

Everything else is secondary.

!SLIDE incremental bullets

I Mean Everything.

  • Features.
  • Efficiency.
  • Performance.
  • Corner-cases.

!SLIDE

urllib2

"I'd rather be writing ColdFusion."

!SLIDE small

subprocess

A powerful module that .

@@@ python
import envoy

c = envoy.run('ls')

.

@@@ pycon
>>> c.status_code
200