Python

Pythonを勉強していて「こういう書き方があったのか」と思ったことを3つ

プログラミングを勉強していると 「こういう時はこんな書き方ができるのか」 とか 「この書き方を知っていればあの時のコードもっとうまく書けたな」 と感じることがあると思います。 この記事では私がPythonを勉強していてそう感じたことを3つ紹介したいと…

GAEのmemcacheモジュールの関数がAptanaやEclipse+PyDevで未定義とされる原因と対策

私はGAEのコードを書く際Aptana studioを使用しているのですが、正しくPathが通っている状態でもmemcacheモジュールだけコード解析でエラーが出ます。 具体的にはmemcacheモジュール内の関数"memcache.get()"などを使用するとその関数は定義されていないとい…

GAEデータストアのModelクラスのインスタンスからそのkey_nameを取得する方法について

これまでModel、Key、Propertyの関係を理解しないままデータストアを使用していた事を改めて思い知りました。(^_^;)下のような都道府県の面積と人口を記録するデータストアのエンティティがあるとします。 class Prefecture(db.Model): area = db.FloatPrope…

WikipediaのAPIを使って情報を取得するクラスを書いてみました

先日公開したスコアアタックしりとりもまだ予定のすべての機能が完成したわけではないのですが、最近は次は何作ろうかなということを考えて様々なサービスのAPIを調べています。今回WikipediaのAPIに接続して情報を取得するクラスを書いてみました。 Wikiped…

文字列がfloat型に変換可能かどうかを確認する正規表現について訂正と補足

以前、ある文字列がfloat型に変換可能かどうかを確認する方法を扱った以下の2つの記事を書きました。 isdigit()について - 主にプログラムを勉強するブログ 昨日のエントリの補足+α - 主にプログラムを勉強するブログ これらの記事、特に後者について訂正と…

エラトステネスの篩

先日の記事にも書きました任天堂のCode Puzzleを解いた際、結果的には使わなかったのですが試行錯誤の仮定でエラトステネスの篩を書いたので更新頻度の低さをごまかすために載せときます(^_^;) def eratos_sieve(max_num=NUM): prime = [True] * max_num pri…

任天堂のCode Puzzleがやっと解けました

GAEやPythonの勉強を中断してずっと挑戦していた任天堂のCode Puzzleがやっと最終問題まで解けました。 この問題は9月中頃ツイッターなどで話題になっていたようなのですが、私は10月に入ってから知りせっかくPythonを勉強中だしやってみようと挑戦を始め2週…

webapp2のセッション機能を使ってみました

先日の記事で書いていたセッションのコードをwebapp2のセッション機能を使って書きなおしてみました。コードはサンプルのものと全く同じです。 class BaseHandler(webapp2.RequestHandler): def dispatch(self): self.session_store = sessions.get_store(re…

データをAjax風にやり取りするように改造してみました

これまで書いてきたGAEのコードではブラウザからの入力データを受け取るたびにページを再描画する方法で画面を更新していましたが、今回ブラウザ側はJavascriptを使ってデータの送受信を行うように改造してみました。 ページ全体を描画するのは最初のアクセ…

memcacheについて昨日の記事の訂正

昨日の記事で書いたmemcacheに関する内容に2点間違いがありましたので訂正です。1つ目はmemcacheにはリストを保存できないと書いたことです。memcacheにはリストを保存できないのでJSON化した上で文字列として保存していると書いたのですが実際はリストや辞…

memcacheを使ってみました

前回のcookieを用いたセッションを書いてみました - 主にプログラムを勉強するブログという記事ではサーバー側のセッションの保存にデータストアを使用していたのですが、memcacheを使用するように書き換えてみました。データストアを使用する場合、エンティ…

cookieを用いたセッションを書いてみました

webapp2などGAE標準添付のフレームワークにもセッションの機能は用意されているのですが今回は勉強の意味も込めてcookieを利用した簡易なものを書いてみました。 IDとパスワードを用いたログイン・ログアウトの機能を持つものではなく単に利用者を識別するだ…

テンプレートを使ってみました

以前書いていたコードではPythonによるプログラム本体に、出力するHTMLがすべて文字列として埋め込まれていたため、HTML編集にIDEによるアシストや構文チェックが使えないのを不便に感じていました。 そこでテンプレートの機能を使ってPythonのコードとHTML…

GAEのデータストアを使ってみました

今回はDatastoreを使ってみました。 チュートリアルではGQLというデータベースを操作するための言語を使用した例を中心に説明されているのですが、こちらの記事などによるとGQLはこれまでにSQLを経験したことがある人がGAEを容易に使用できるようにするため…

Python2.7でGAEの基本的なコードを書いてみました

いつの間にかGoogleのサイトにPython2.7向けのGoogle App Engineチュートリアルができていたので改めて最初から読んでみました。 以前Google app engineと文字コードという記事を書いた際にはPython2.5を使用していたのですがこの時とは少なからず仕様の変更…

標準入出力のエンコード

前回できるだけ少ないコード改変でEclipseでもコマンドプロンプトでも文字化けしない方法について書いたのですが、コメントで "sys.stdout.encoding"という属性があることを教えていただきました。 これは現在の実行環境で標準入出力をどの文字コードで行な…

print文以外の文字化けについて

今回はPython2.7でprint文以外で発生する日本語の文字化けについて書きたいと思います。 print文での文字化けについては以前書いたので以下の記事を参考にしてみてください。 Pythonの日本語の扱い - 主にプログラムを勉強するブログ Pythonで日本語が文字化…

doctestの実行方法について

前回のエントリでdoctestの実行方法についてコメントで教えていただいたので新たに書き直しました。まず昨日のエントリで私が書いていたコードは def main(initial=u"あ", inputsource=multi_input_reader()): u""" 正常パターン >>> main(inputsource=[[u"…

マルチスレッドはてなキーワードしりとりのdoctestを書いてみました

先日の記事に対して「標準出力のテストにはunittestよりdoctestのほうがいいよ」と教えていただいたのでdoctestを書いてみました。書いていて気づいた点なのですが、doctest内でunicode型文字列を使いたい場合、docstring自体をunicode型にしておく必要があ…

マルチスレッドはてなキーワードしりとりを改造・その4

前回のコードではmulti_input_reader関数がmain関数のローカル変数である"usedwords"を引数としていたためmainとmulti_input_readerの分離が悪い、と書いていましたが、この問題への対処としてmulti_input_reader関数は引数を取るのをやめ入力の受付のみに特…

マルチスレッドはてなキーワードしりとりを改造・その3

先日のコードに頂いたコメントを参考に一部を書き直しました。今回最大の変更点は入力を受け付けるmulti_input_reader関数をジェネレータにし、従来main関数に書いた"while True"で行なっていた全体のループをこのジェネレータで管理するようにしました。 そ…

マルチスレッドはてなキーワードしりとりを改造・その2

前回のコードではshiritori.Furiganaクラスのインスタンス作成を子スレッドで行なっていたのですが子スレッドで発生した例外は親スレッドのtry文では受け取れないことが分かったのでこの処理は親スレッドで行うように変更しました。 この処理を含め、スレッ…

マルチスレッドはてなキーワードしりとりを改造・その1

まず先日書いたコードはしりとりの最重要ルールの一つである「同じ単語は二度使えない」ルールを判定するための処理を丸々書き忘れていました(^_^;) 文字通り「忘れていた」んですが入力を受け付ける部分も関数ではなくクラス化して継承すればそういったミス…

マルチスレッドはてなキーワードしりとりを作ってみました

前回のエントリまでに書いていたはてなキーワードしりとりは という処理だったのでAPIからのXMLを待つ時間が長くなってしまっていました。 APIに問い合わせて返答を待つ時間はローカルのみで処理するほかの処理と比べて時間がかかるからです。そこでこれを解…

はてなキーワードしりとりを改造・その7

その6のコードには昨日、一昨日の記事に書いていたイミュータブルな型の継承に関する間違いがあったのでそれを修正しました。 また例外が発生した際に従来は「この単語ははてなキーワードに登録されていませんでした。」というような表記だったのですが「『…

immutableな型のカスタマイズについて

(5/16追記。このエントリの結論は違っていました。コメント欄をご覧ください。)昨日の記事でunicodeクラスを親として作成したクラスが思い通りに動かなくて嵌っていると書いたのですが、これは 「unicode型がイミュータブルだから」 ということのようです。i…

unicodeクラスの継承は特殊?

unicodeクラスを継承したクラスの挙動で嵌っていることがあるので書いてみようと思います。 下のようなunicodeクラスを継承したTestというクラスを作ります。xという引数が1つだけありインスタンスが作成されると同時にそれを表示するというクラスです。この…

はてなキーワードしりとりを改造・その6

先の記事で「例外処理をクラスにする意義がわかった」なんて書いてしまったのですが分かっていませんでした(^_^;) それどころか大きな勘違いをしており先のコードには致命的な間違いがありました。 またクラス変数についても重大な勘違いをしているところが…

はてなキーワードしりとりを改造・その5

前回書きなおした例外処理ですが、せっかく専用の例外クラスを作成したにも拘らずどの例外が発生したかを判別する処理がクラスの外(main関数)にあるという本末転倒になっていたので再度書きなおしました。 自分でもどうもしっくりこないと思いながら書いては…

はてなキーワードしりとりを改造・その4

記事にも書いていましたが前回のコードは例外処理があまりにも煩雑だったので改めて例外処理を書きなおしました。どうすればすっきり分かりやすくて且つ期待通りの例外処理ができるかを考えるためにまず処理したい例外を整理します。 入力された単語が既に使…