PythonのIDE

とりあえず、IDLEを試してみることにしました。いろいろといじってみてわかったことは……

IDLE

  • 軽くて便利。ただ、IDLEのエディタとPythonシェルの日本語の挙動は注意がいるっぽい。最初に本を読みながらPythonの練習をするときは、IDLEのシェルは使わないほうがいいかも。

IDLEのエディタ

  • ソースコードの1行目に# -*- coding:utf-8 -*-とか# -*- coding:cp932 -*-とか書いておくと、セーブするときに自動的にその文字コードエンコードしてくれる。
  • ソースコード1行目のエンコード指定がない場合は、IDLEエディタの設定ウィンドウで指定したエンコード(localかutf-8)でエンコードしてくれる。
  • ソースコード1行目のエンコード指定もなく、IDLEエディタの設定もエンコードなし(None)にしている場合、Windowsでは入力した文字がCP932のテキストになっているので、セーブするときにIDLEが「先頭に# -*- coding: cp932 -*-を入れたほうがいいよ? いいの?」と注意してくれる。これを無視してセーブするとそのままcp932でセーブされるのですが、Python文字コード指定の書かれていないコードをutf-8と仮定して実行するとのことなので、実行時にエラーを起こしたりします。
  • なお、IDLEエディタ側のデフォルト設定をutf-8としていた場合は、1行目の文字コード指定がない場合に自動的にutf-8でセーブしてくれるのですが、先頭にutf-8のバイトオーダーマーク(BOMというやつ。EF BB BFの3バイト)が入ったテキストになるようです。ところが、1行目にエンコード指定を入れることによってutf-8としてセーブされた場合は、BOMなしのutf-8としてセーブされます。また、BOMのついたソースにあとからエンコード指定を入れてセーブすると、何も言わずにスッとBOMを消してくれるようです。ソースコードエンコード指定を書いておけば、BOMなんていらないよ、というわけですね。
  • というわけで、とりあえずソースコードの頭に# -*- coding: utf-8 -*-を入れておけば、セーブしたときに自動的にutf-8に揃えてくれる(IDLEエディタの設定が何かに関わらず)ので、混乱しにくいと思います。なるべくBOMもつけたくないので、私はまめにこの指定を書くことにしました。

IDLEのコンソール

Windows版IDLEのコンソールの表示は、cp932で表示しているっぽい。なので、cp932で書いたテキストはそのまま表示できる。

>>> x="いろは"
>>> print x
いろは
>>> x
'\x82\xa2\x82\xeb\x82\xcd'

きちんとcp932になってますね……
これをLinux版のIDLEでやると、

>>> x="いろは"
>>> print x
いろは
>>> x
'\xe3\x81\x84\xe3\x82\x8d\xe3\x81\xaf'

utf-8ですね。その人の環境次第なのかな? とりあえず、こっちはこっちで入力と出力が揃ってます。
では、WindowsのIDLEエディタで

# -*- coding:cp932 -*-
x = "いろは"
print x

こういうスクリプトを書いてみます。これを実行すると、

いろは
>>>

きちんとPythonシェル上に表示できました。これをLinux上のIDLEでやると、何も表示されません。この辺の、Pythonシェルが表示するエンコードの違いは要注意っぽいですね。なお、Linux版のIDLEエディタで上記の「# -*- coding:cp932 -*-」を入れたソースファイルも、きちんとCP932で保存してくれていました(ghexで確認)。

もうひとつ。Windows版のPythonコンソール(IDLEのじゃなくて、Python本体についてる、コマンドプロンプトみたいな奴)でユニコード文字列を扱うとき、

>>> x=u"いろは"
>>> print x
いろは
>>> x
u'\u3044\u308d\u306f'

となります。
また、続けて

>>> y = x.encode('cp932')
>>> print y
いろは
>>> y
'\x82\xa2\x82\xeb\x82\xcd'

となるので、Pythonコンソールの表示もCP932の模様。
ところが、IDLEのPythonシェルでは

>>> x=u"いろは"
>>> print x
‚¢‚ë‚Í
>>> x
u'\x82\xa2\x82\xeb\x82\xcd'
>>>

となりました。つまり、IDLEのPyhtonシェルでは、u"いろは"を「"いろは"に相当するCP932コードを持ったunicode文字列」として解釈してしまうようで、無意味な値になってしまっています。Python初心者向けの本は、だいたい導入部にコンソールをいじってみよう! という節があるっぽいですが、練習でPythonコンソールのかわりにIDLEのPythonシェルを使うと、うまくいかなくてはまるかもしれません。私ははまりましたw

文字コード周りはもっと練習が必要なようです……