Upload
toru-furukawa
View
1.768
Download
0
Embed Size (px)
Citation preview
おまえらこのライブラリ使ってないの? m9
ふるかわとおる @torufurukawa
お前だれよ?
• ふるかわとおる • @torufurukawa • #bucho • 株式会社バスキュール – TV連動サービス作ってますした
アンケート結果より...
• 仮想環境 • シェル拡張 • コーディングスタイル • テスト
• 追加は #pyfes #m9 で、ツイートしてください。 h8ps://twi8er.com/search?q=%23pyfes%20AND%20%23m9&src=typd
仮想環境でインストールし放題
• 複数のプロジェクト • ライブラリの競合を避けたい
virtualenv
$ virtualenv . $ ls bin include lib $ source bin/activate インストールし放題!
venv (3.x)
$ python3.3 -‐m venv . $ source bin/activate インストールし放題!
virtualenvwrapper
$ mkvirtualenv myenv $ workon myenv インストールし放題!
対話シェル拡張
• 対話シェルだけでは... • Python の対話シェルでもっといろいろやる
ipython $ ipython Python 2.7 (r27:82500, Nov 7 2010, 14:17:28) Type "copyright", "credits" or "license" for more informaXon. IPython 0.13.2 -‐-‐ An enhanced InteracXve Python. ? -‐> IntroducXon and overview of IPython's features. %quickref -‐> Quick reference. help -‐> Python's own help system. object? -‐> Details about 'object', use 'object??' for extra details. In [1]:
In [1]: import random In [2]: random.choice? Type: instancemethod String Form:<bound method Random.choice of <random.Random object at 0x10183f820>> File: /usr/local/Cellar/python/2.7/lib/python2.7/random.py Definition: random.choice(self, seq) Docstring: Choose a random element from a non-‐empty sequence.
In [3]: random.choice?? Type: instancemethod String Form:<bound method Random.choice of <random.Random object at 0x10183f820>> File: /usr/local/Cellar/python/2.7/lib/python2.7/random.py Definition: random.choice(self, seq) Source: def choice(self, seq): """Choose a random element from a non-‐empty sequence.""" return seq[int(self.random() * len(seq))] # raises...
ls とか cd とか
In [4]: ls bin/ lib/ share/ include/ man/ src/ In [5]: cd src /Users/torufurukawa/works/pyfes201307/src
コマンド実行
In [6]: !ps PID TTY TIME CMD 2739 8ys000 0:00.84 -‐zsh 6059 8ys000 0:01.13 /Users/torufurukawa/works/pyfes201307/bin/python2.7 /Us....
In [7]: !redis-‐server [6080] 27 Jul 12:59:29 # Warning: no config file specified, using the default config. In order to specify a config file use 'redis-‐server /path/to/redis.conf' [6080] 27 Jul 12:59:29 * Server started, Redis version 2.4.10 [6080] 27 Jul 12:59:29 * The server is now ready to accept connecXons on port 6379
bpython
誰か書いて
コーディングスタイル
• 汚いコードを見つけてくれる • 自分でチェックしなくていい!
from urllib import urlopen # 使ってない def add(a, b ): # カッコのまわりに不要スペース addressess = None # スペルミス return a + b
pep8
$ pep8 spam.py spam.py:2:1: E302 expected 2 blank lines, found 0 spam.py:2:13: E202 whitespace before ')'
pyflakes
$ pyflakes spam.py spam.py:1: 'urlopen' imported but unused spam.py:3: local variable 'addressess' is assigned to but never used
flake8
$ flake8 spam.py spam.py:1:1: F401 'urlopen' imported but unused spam.py:2:1: E302 expected 2 blank lines, found 0 spam.py:2:13: E202 whitespace before ')' spam.py:3:1: F841 local variable 'addressess' is assigned to but never used
misspellings
$ misspellings spam.py spam.py:3: addressess -‐> "addresses"
HTTP リクエスト
• urllib だけだとちょっと... • リクエストを簡単に書きたい • レスポンスを簡単に取得したい
requests >>> import requests >>> r = requests.get('h8p://wozozo.jp/') >>> r.status_code 200 >>> r.content '\n<!DOCTYPE html>\n<!-‐-‐[if IEMobile 7 ]><html class="no-‐js iem7"><![endif]-‐-‐>\n<!-‐-‐[if lt IE 9]><html class="no-‐js lte-‐ie8"><![endif]-‐-‐>\n<!-‐-‐[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!-‐-‐><html class="no-‐js" lang="en"><!-‐-‐<![endif]
>>> r.json() # 辞書を返す {'spam': 'ham', 'foo': [1,2,3]}
requests.post( 'h8p://wozozo.jp/',
data={'name': 'xaxtsuxo'}, # パラメータ auth=('user', 'pass') # Basic Auth )
テスト
• テストを手早く書きたい • 失敗したテスト結果は分かりやすくならん?
py.test
• テストランナー + ディスカバラー • エラーをきれいに見せてくれる • 確認しやすい
import uni8est class MyTest(uni8est.TestCase): def test(self): self.assertEqual(True, True) def test2(): x = {'foo': 'bar', 'hoge': 'fuga'} y = {'foo': 'bar', 'hoge': 'wozozo'} assert x == y
$ py.test mytest.py ============================= test session starts ============================== pla{orm darwin -‐-‐ Python 2.7.0 -‐-‐ pytest-‐2.3.5 collected 3 items mytest.py .F ...
... def test2(): x = {'foo': 'bar', 'hoge': 'fuga'} y = {'foo': 'bar', 'hoge': 'wozozo'} > assert x == y E assert {'foo': 'bar', 'hoge': 'fuga'} == {'foo': 'bar',...ge': 'wozozo'} E Hiding 1 idenXcal items, use -‐v to show E Differing items: E {'hoge': 'fuga'} != {'hoge': 'wozozo'}
watchdog
• ファイル変更を監視して、コマンド実行 • 継続的テスト
watchdog
$ watchmedo \ shell-‐command \ -‐-‐pa8erns="*.py" \ -‐-‐command="py.test \ mytest.py"