Hatena::ブログ(Diary)

気になるITまわり RSSフィード

2014-03-08

[]Pyramid scheduler

重い処理のために非同期実行どうしようか悩んでいたら、Pyramid-schedulerってのがあるようなので使ってみることに。

2014-02-12

[]Pyramid2

Pyramid - 気になるITまわり

の記事で書いたんだけど、どうも自分の環境だとうまくいかないことに気づいた。

環境的には

どうも

pcreate -s alchemy PROJECT_NAME

だけだと

pserve develop.ini

したときにエラーはくか、http://localhost:6543にアクセスすると見つからない現象が起こる。

理由はいまいち分からないけど、

pcreate -s alchemy PROJECT_NAME
pcreate -s starter PROJECT_NAME

してから

python setup.py develop
pserve develop.ini

だと、動くようになる。

2014-01-04

[]Pyramid

PythonのフレームワークPyramidをとりあえず動かすまで。

環境はwindows7

virtualenvのインストール

モジュールのバージョン違いとかに悩まされないように、Pythonの仮想環境を管理してくれるvirtualenvを入れとくと便利。

pip install virtualenv

インストールしてあるモジュールを全部はずした環境を用意

virtualenv --no-site-packages DIR_NAME

仮想環境を実行するにはDIR_NAME/Script以下にあるactivateを実行するんだけど、毎回マンドを打つのがめんどくさいのと色々忘れそうだからbatを用意

call パス\Scripts\activate.bat
cd ワークスペース\pyramid
cmd start

ちなみにactivateで仮想環境を実行した後はdeactivateコマンドで仮想環境を終了できる。

virtualenvは↓を参考にしました。

no title


Pyramidをインストール

Pyramidのサイトを見るとeasy_installを使えとのことだったのでeasy_installでインストール

ちゃんとvirtualenvで構築した仮想環境で以下を実行。

easy_install pyramid

Pyramidのプロジェクト作成

pcreateっていうコマンドを使います。

pcreate -s starter PROJECT_NAME

このコマンドをうつと便利機能のついたページを用意してくれるので、初心者はたぶん実行しといたほうがいいと思います。

で、sqlalchemyを使うので

pcreate -s alchemy PROJECT_NAME

Pyramidプロジェクト開発用ビルド

作成されたプロジェクトにはsetup.pyが用意されてるのでそれを使います。

python setup.py develop

テスト実行

自動生成されたプロジェクトにテストコードも含まれてるので、一応それの実行方法ト

python setup.py test -q

アプリケーションの実行

pserveコマンドを使います

pserve development.ini

ブラウザでhttp://localhost:6543にアクセスしてページが出ればOK。


Pyramidは日本語のドキュメントあるので、すごくとっつきやすいです。

Pyramid Web アプリケーション開発フレームワーク — The Pyramid Web Application Development Framework v1.4.3 (翻訳)

2012-04-04

[]Pythonのユニットテストとモック

Javaの人から見るとびっくりするPython

class Language:
  def getName(self):
    return 'Java'

class Person:
  def __init__(self):
    self.language = Language()

  def getLanguage(self):
    self.language.getName()

Language.getNameはJavaという文字列を返すだけ、Person.getLanguageはLanguage.getNameに委譲をかけてるだけ。

class PersonTest(unittest.TestCase):
  def setUp(self):
    self.person = Person()

  def testGetLanguage(self):
    self.assertEqual('Java', self.person.getLanguage())

if __name__ == '__main__':
  unittest.main()

実行すれば、当然のごとくOK。

じゃ、テストコードをちょっと変えてみると・・・

class PersonTest(unittest.TestCase):
  def setUp(self):
    self.person = Person()

  def testGetLanguage(self):
    def getName(self):
      return 'Python'
    #Language.getNameの実装を上のgetNameに置き換えてる
    Language.getName = getName

    self.assertEqual('Python', self.person.getLanguage())

if __name__ == '__main__':
  unittest.main()

とこんなことができて、モックライブラリとかいるの?見たいな状況に・・・

2011-05-10

[]Pythonにおけるアクセス修飾子

しばらくPythonから離れていたので、細かいところを忘れていたのでメモ。

アクセス制限

PythonにはJavaのようにprivateとかprotectedみたいなアクセス修飾子がない。「_(アンダーバー)」による規則として扱う。

「_」のようにアンダーバーがひとつの場合は、オブジェクトの中で使用する変数。やろうと思えばオブジェクトの外からアクセスできるけど、あくまでクラスを作った人の意図を表すものとして使用する。

「__」のようにアンダーバーが2つの場合は、外からは簡単にアクセスできなくなる変数、Javaで言うところのprivateみたいな感じ。

class Foo:
  def __init__(self, name):
    self._name = name
    self.__name = name

f = Foo('bar')
print(f._name)
print(f.__name)

一番下の行はエラーとなる。内部的な動きとしては__nameは難読化されてるだけで、アクセスしようと思えばできる。