Python mini Hack-a-thon 10に行って来た

新宿都庁付近にある「株式会社 gumi」さんのオフィスで行われた、
Python mini Hack-a-thon 10 (通称 Pyhack )に参加してきました。

Togetterまとめ:
http://togetter.com/li/159536

Pyhackには初めての参加で、一切の勝手が分からないまま参加してしまいましたが、
参加者の皆さんがとても気さくで凄くリラックスしつつ貴重な経験をすることができました。

まぁほんと、色々な人がいらっしゃいましたね...。
GAEで何か作ってみる系の人、読書する人、EuroPythonの冒険記を語る人..。
中にはシンセをPythonで作ってしまうStylishな人もいらっしゃいました。

今回参加させて頂いた事で、ハッカソンの醍醐味がなんとなく分かった気がします。
色々な分野に特化した人達が一度に集まる場所というだけで
勝手に開発もモチベートされますし、
自分の興味のある事について詳しい人が誰かしらいらっしゃるので
それに関連する人脈が作り易かったですね。
俺自身も、大学の研究で触っているPython関連のプロジェクトに
詳しい人や、エキスパートなPythonista達とのコネクションを作る事ができました。

あと、「時間制限」というのを常に意識しないといけない環境に身を置くというのが
如何に自分の能力を増幅させるか、というのを今回改めて認識させられましたね。
今回は11時開始の17時発表で、
「開発時間はあれどたっぷり十分ではない」という時間制限の中開発を行いました。
すると、普段家でダラダラ開発するよりも3倍は開発効率が高まった感じがします。
かの著名な脳科学者である茂木先生が「タイムプレッシャー」と呼んでいるモノですね。
ハッカソンやスプリントというのは、これの感覚を養うのにも
とても役に立つと言えると思います。

肝心の自分は、「WebAPIのPython用ライブラリの開発」と題しまして開発を行いました。
簡単に言えば楽天商品検索APIPython用ライブラリ(ラッパー)です。
最初、初めての空気でキョドってしまいテストコードを書くのに1時間以上
費やしたりしてあたふたしてしまいましたが、
5時間で簡単な検索やフィルタリング、ソートまでを実装できました。

今後、ドキュメントを用意したりより機能を洗練させたりした後に公開しようと思います。


ちなみにこんな雰囲気でした(プライバシー保護の為モザイクをかけています)

次回も都合が合えば、是非参加させて頂きたいと思います。

参加された方、お疲れ様でした!

Pythonでディレクトリの上層にあるモジュールをimportするときの注意点

さて、今日は何かと忌み嫌われがちな「Pythonのimport文」についての記事を書きたいと思います。
その中でも特に、「今編集しているスクリプトより上層のディレクトリにあるモジュールをimportしたくなった」時にハマるケースについて取り上げます。


今、次のようなファイル構成でPythonのアプリケーション(モジュール)を書いていたとします。



my_module/A/A.pyを編集中, B/B.pyの機能が使いたくなったとします。
Pythonでは, from ... import ...の構文でimportを行う場合に
相対パスを指定する事ができるので、
my_module/B/__init__.pyに import Bと書いておき
from ..B import B と書く事でmy_module/B/B.pyをインポートすることにします。



ところが、ここで動作確認をしようとして、
Aディレクトリ上で python A.py などとすると噛まれます。

Traceback (most recent call last):
File "A.py", line 4, in
from ..B import B
ValueError: Attempted relative import beyond toplevel package


これは、Pythonの「現在実行されているファイルをモジュールのルートと見なす」
という仕様に起因するものです。
今、my_module/A 上でA.pyを実行したので、
インタプリタにとってはAディレクトリがルートとして認識されています。
なので、その上層にあるmy_moduleディレクトリはインタプリタにとっては
見えなくなっており、importに失敗してしまうという事です。


では、my_module/A/__init__.pyに import A と書いておき
今度はmy_moduleディレクトリ上でインタラクティブシェルを起動し、
import Aを実行
してみましょう。

Traceback (most recent call last):
File "", line 1, in
File "__init__.py", line 4, in
import A
ValueError: Attempted relative import beyond toplevel package

すると、やっぱり噛まれます。

Pythonでは、上図中の赤線に含まれる階層から実行しても同様にダメという決まりがあるようです。

なので、my_module/__init__.pyにもimport Aと書いておき
my_moduleが置かれているディレクトリ上インタラクティブシェルを実行して
import my_module すると先ほどのエラーが出なくなり、うまく動いていることが分かります。



すなわち、相対パスを用いたimportを使っているPythonプロジェクトでは、
動作確認にはそのプロジェクトのディレクトリの外にテスト用の
スクリプトを置いてそれを実行することになります。


Initial Commit

皆さんこんにちは。ロングスリーパー大学院生のRyoです。
本サイトでは主にプログラミング関連、特にPython,C++,JavaScriptを用いた何かについて色々アウトプットしていこうと考えています。
他にも、マインドマップ等の学習ノウハウに関しても何らかのアウトプットができたらなと考えています。

このサイトが皆様のお役に少しでも立てたら幸いです。
宜しくお願いします。