最近の言語はSQLite3のライブラリが入っていることが多いですね。
Python 2.6でも簡単で、
import sqlite3
db = sqlite3.connect('data.db')
db.execute('create table users (id integer primary key, name text, age integer)')
db.execute('insert into users (name, age) values (?, ?)', ('yamada', 21))
のように簡単に扱えます。
ところが、使い方を間違えると
Incorrect number of bindings supplied. The current statement uses 1, 10 supplied.
のようなエラーが出てしまうことがあります。
原因は単純。
executeの第2引数はタプルにしないといけません。
項目が1個のとき、()で囲んだだけだとダメですね・・・
#ダメな例
db.execute('select * from users where name = ?', ('yamada'))
#良い例
db.execute('select * from users where name = ?', ('yamada',))
基本的ですが、普段別の言語を書いていると気づくのが遅れます。
当然ながら、言語ごとに真偽判定(true/false)の基準が違います。
特にスクリプト系の言語では、明示的に型を指定しないことが多いので、たまに問題になります。
たまたま手元にあった環境で、どんな値が真に判定されるのか、というのをまとめてみました。
新しい言語に突撃するときのメモ代わりにでもして頂ければ幸いです。
検証コードイメージ
a = 0
if a
print 'true'
else
print 'false'
end

凡例:
× は、コンパイルエラー
ー は、言語仕様にその値が存在しない
備考:
*”" というのは、ナル文字の値を指す(\0なので、実体はゼロという整数値)
array[] というのは、各言語での空の配列を指す
※1 C言語にfalseは存在しない
※2 配列のアドレスを指すため、真と評価される
※3 noticeが発生するが、設定や@で抑制可能
こうしてみると、やはりPHPは変態です。’0′ をfalseと判定する言語はあまりないですね。Webに特化しているのがよくわかります。$_GETなどは文字列で渡ってくるので、確かに手抜きに便利仕様です。
空配列をfalseと判定するのが、PythonとPHPというなんだかおもしろい組み合わせになりました。
良く忘れるけど、rubyはゼロという数字をtrueに判定するので注意が必要ですね。
結局、ミスのしようが無い Java / C# は安全で好きです。
また、ゼロは false、ほかは true と割り切ったC言語も、シンプルで好きです。
pythonには便利なloggerが最初から入っているので、最初からprintじゃなくてこっちを使っておけば良いですね。
小規模なプログラムでも役立ちます。
main.py
import logging
import logging.config
logging.config.fileConfig('./logging.conf')
mylog = logging.getLogger('mylog1')
mylog.debug('hello')
mylog.error('oh no!')
logging.conf
[loggers]
keys=root,mylog1,mylog2
[handlers]
keys=default,file1,file2
[formatters]
keys=basic
[logger_root]
level=NOTSET
handlers=default
[logger_mylog1]
lebel=NOTSET
handlers=file1
qualname=mylog1
[logger_mylog2]
lebel=NOTSET
handlers=file2
qualname=mylog2
[handler_default]
class=StreamHandler
level=NOTSET
formatter=basic
args=(sys.stdout,)
[handler_file1]
class=FileHandler
level=NOTSET
formatter=basic
args=(”log1.log”,’a')
[handler_file2]
class=FileHandler
level=NOTSET
formatter=basic
args=(”log2.log”,’a')
[formatter_basic]
format=%(name)s: %(asctime)s %(levelname)s %(message)s
datefmt=%Y/%m/%d %H:%M:%S
class=logging.Formatter
confファイルに複数のlogger、handlerを指定することで、複数のファイルに書き込んだり、標準出力とファイルの両方に書き込んだり、エラーレベルでフィルタリングしたりできます。formatterを指定することで、日付を表示したりといった加工が簡単にできます。
便利ですね。
SQLやCSVなどをごりごりと構築する際、項目区切りにカンマを付けて、最後のカンマを取り除く処理をよくやりますね。
PHPに慣れると、mb_substr() などとやるのが何となく億劫になりますが、pythonだとコードの見た目がスマート。
さすがです。
datas = ('hoge', 'piyo', 'foo', 'baa')
text = ''
for data in datas:
text += data + ','
text = text[:-1]
ただ、なんとなく、表情が硬いので、text :- ) とか書けるとさらに可愛かったのですが・・・