Python デコレータを学ぶ 1

Python で関数に機能を追加する仕組みとしてデコレータというものがあります。Flask のチュートリアル で @ を使ったシンタックスがあって、どういう意味か調べるとこれがデコレータというものでした。

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

ある関数をラップして、その関数にもともと定義されている振る舞いに別な動作を追加することができます。ラッパーの部分は別途定義されているので、動作を追加したい対象の関数が複数あっても記述が煩雑になりません。

例えば以下の様な関数を定義して実行してみます。

def sandwich(food='--ham--'):
    print(food)


sandwich()

実行結果は以下のようになります。

$ python decolate.py

--ham--

これに bread() というデコレータを定義して sandwich() をデコレートしてみます。デコレータは関数を引数に取り、処理を追加した上で関数を返す関数です ...

more ...

ゴミをすぐ捨てる

最近心がけていることのひとつに、ゴミが発生したらできるだけ速やかに捨てる、というのがあります。

例えば、お菓子を食べているときに包み紙のゴミが出るとしたらそれを机の上に一時的に置いたりすることをせずに、即捨てます。ティッシュで鼻をかんだり口元を拭ったりしたあともすぐ捨てます。

こうすることによって「捨てられるべきゴミ」という物体が存在している時間を限りなくゼロに近づける、というふうに意識するようにしています。

ゴミ箱(袋)に入って「捨てられたゴミ」となってしまえば、もうそれに煩わされることはなくなります。平穏な気持ちで生活を続けることができるので気に入っているのでした。

more ...

Python ファイル作成時のテンプレートを設定

以前に .rst ファイルのテンプレートを作成したのと同じ要領で .py ファイルにも autoinsert を使って、必要な部分が最初から挿入されているように設定しました。

Python の本や他人のコードなどでよく見られるお約束的な部分(__name__ が __main__ かどうかを見る)について、これまでは何となく避けていましたが、今後は基本に忠実に、真似るべきところは真似るようにしていきます。

#!/usr/bin/env python
#-*- coding: utf-8; -*-


def main():
    pass


if __name__ == '__main__':
    main()

こういうテンプレートファイル(template.py)を用意して init.el を少し編集します。

;; 各ファイルによってテンプレートを切り替える
(setq auto-insert-alist
      (nconc '(
               ("\\.rst$" . ["template.rst" my-template])
               ("\\.py ...
more ...

Git コミット方法の違いについて

書籍「入門 git」を読んでいて第 4 章にコミットする 3 通りの方法について説明がありました。

  1. git add でステージングしてから git commit する
  2. git commit に -a オプションをつける
  3. git commit に ファイル名を指定する

add してから commit

$ git add Good.py
$ git commit -m "Add print func"

どういう形かで git add して、それから commit するやり方です。git add は -i オプションで対話モード、 -p でパッチモードが利用できるようです ...

more ...

Git の勉強つづき

昨日から始めた Git の勉強の続きです。 Git ではメインの編集履歴とは別に、途中から枝分かれした別バージョンの編集履歴もうまい具合に管理できます。一連の編集履歴のまとまりをブランチ(branch)と言い、デフォルトではメインのブランチ名が master となっています。

現在のブランチを確認するには git branch というコマンドを入力します。

また git branch <branch-name> とすると <branch-name> という名前のブランチを新たに作ることができ、git checkout <branch-name> で操作対象をそのブランチに切り替えます。

また、git checkout -b <branch-name> としても同じ結果(ブランチの作成および切り替え)が得られます。

別ブランチでファイルに変更を加えてコミットしてから、もとのブランチに戻ってファイルを確認すると変更前の状態のままとなっています。別ブランチで起きたことはあくまで別ブランチのことであって影響はおよびません。

git merge <branch-name> で現在のブランチに <branch-name> の変更内容をマージすることができます。

more ...

Git 始めます

使おう使おうと思いつつ、まだ習得していなかった Git についてそろそろきちんと学ぼうと思います。

まずテスト用のディレクトリ、ファイルを作ります。

$ mkdir myproject
$ cd myproject
$ echo hello, world > readme.txt

git init で初期化します。

$ git init
$ ls -a
.          ..         .git       readme.txt

まず git add でファイルをステージング状態に移して、git commit でコミット。-m オプションでコミットメッセージを追加します。

$ git add .
$ git commit -m "initial commit."

ファイルに一行追加して git diff で差分を確認できます。

$ echo Nice to meet you ...
more ...

Python からシステムのコマンドを利用する

Python の os モジュールを使って Python からシステムのコマンドを利用することができます。Python のスクリプトから ls や cp などのMac のシェルで使うコマンドを実行できるのです。 os.system( コマンド名 ) とすれば OK でした。

In [1]: import os

In [2]: os.system('pwd')
/Users/ryosuke/Dropbox/Projects/PyStudy
Out[2]: 0
more ...

Python でファイル名と拡張子を分離する

Python の os モジュールでファイル名の拡張子とそれ以外の部分とを分けることができます。 os.path.splitext( ファイル名 ) という形で指定するとファイル名と拡張子のタプルが返ってきます。ファイルのリネーム処理を Python からする場合などに役立ちそうですね。

In [15]: file = 'pelicanconf.py'

In [16]: a = os.path.splitext(file)

In [17]: a
Out[17]: ('pelicanconf', '.py')

In [18]: type(a)
Out[18]: builtins.tuple
more ...