おまえらこのライブラリ使ってないの?	
  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"	
  

おまえらこのライブラリ使ってないの? m9 (2013-07)

  • 1.
  • 2.
    お前だれよ? •  ふるかわとおる   • @torufurukawa   •  #bucho   •  株式会社バスキュール   – TV連動サービス作ってますした  
  • 3.
    アンケート結果より... •  仮想環境   • シェル拡張   •  コーディングスタイル   •  テスト   •  追加は  #pyfes  #m9  で、ツイートしてください。   h8ps://twi8er.com/search?q=%23pyfes%20AND%20%23m9&src=typd  
  • 4.
  • 5.
    virtualenv $  virtualenv  .   $  ls   bin          include  lib   $  source  bin/activate   インストールし放題!
  • 6.
    venv  (3.x) $  python3.3  -­‐m  venv  .   $  source  bin/activate   インストールし放題!
  • 7.
    virtualenvwrapper $  mkvirtualenv  myenv   $  workon  myenv   インストールし放題!
  • 8.
    対話シェル拡張 •  対話シェルだけでは...   • Python  の対話シェルでもっといろいろやる
  • 9.
    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]:  
  • 10.
    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.
  • 11.
    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...  
  • 12.
    ls  とか  cd  とか In  [4]:  ls   bin/    lib/    share/   include/  man/    src/     In  [5]:  cd  src   /Users/torufurukawa/works/pyfes201307/src
  • 13.
    コマンド実行 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....  
  • 14.
    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  
  • 15.
  • 16.
  • 17.
    from  urllib  import  urlopen    #  使ってない   def  add(a,  b  ):    #  カッコのまわりに不要スペース          addressess  =  None    #  スペルミス          return  a  +  b  
  • 18.
    pep8 $  pep8  spam.py   spam.py:2:1:  E302  expected  2  blank  lines,  found  0   spam.py:2:13:  E202  whitespace  before  ')'  
  • 19.
    pyflakes $  pyflakes  spam.py   spam.py:1:  'urlopen'  imported  but  unused   spam.py:3:  local  variable  'addressess'  is  assigned   to  but  never  used
  • 20.
    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
  • 21.
    misspellings $  misspellings  spam.py   spam.py:3:  addressess  -­‐>  "addresses"
  • 22.
    HTTP  リクエスト •  urllib  だけだとちょっと...   •  リクエストを簡単に書きたい   •  レスポンスを簡単に取得したい
  • 23.
    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]
  • 24.
    >>>  r.json()    #  辞書を返す   {'spam':  'ham',  'foo':  [1,2,3]}    
  • 25.
    requests.post(    'h8p://wozozo.jp/',            data={'name':  'xaxtsuxo'},    #  パラメータ            auth=('user',  'pass')    #  Basic  Auth   )
  • 26.
    テスト •  テストを手早く書きたい   • 失敗したテスト結果は分かりやすくならん?
  • 27.
    py.test •  テストランナー  +  ディスカバラー   •  エラーをきれいに見せてくれる   •  確認しやすい
  • 28.
    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  
  • 29.
    $  py.test  mytest.py   =============================  test  session   starts  ==============================   pla{orm  darwin  -­‐-­‐  Python  2.7.0  -­‐-­‐  pytest-­‐2.3.5   collected  3  items       mytest.py  .F   ...  
  • 30.
    ...            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'}    
  • 31.
  • 32.
    watchdog $  watchmedo            shell-­‐command            -­‐-­‐pa8erns="*.py"            -­‐-­‐command="py.test            mytest.py"