nykergoto’s blog

機械学習とpythonをメインに

Pythonの日本語に対する厳しさ

タイトルのとおりです。詰まりました。一応どうやったらどうなったかを書いておこうと思うのですが、なぜそうなったのか文字コードについてほとんど全くわかっていない、それはすなわちASCIIだのunicodeだのShiftJISだのの違いがいまいちわかっていないって言うことなんですが、そんなゆとりな知識しかないので、そのうちこれについてちゃんと勉強しないと行けないなと感じている次第です。夏休みの課題の一つとしたいです。

さて、本題です。書いたコードは以下の様。

class FirstClass:
    """コメントは3重クォーテーションで"""
    ID = 0
    def __init__(self,value,name):
        """constructor!
        基本的にインスタンス変数はコンストラクタで初期化しましょう
        これはC#とかでも見習ったほうがいいかもしれん
        """
        self.data = value
        FirstClass.ID += 1
        self.id = FirstClass.ID
        self.name = name

    def setdata(self,value):
        self.data = value
    def display(self):
        print self.data
        return

インスタンス変数は明示的に書くんじゃなくてコンストラクタ、もしくは一般のメソッド(なんというゆるふわ感!)で定義していくんやなー、クラスに属する変数は明示的に書くんやな、なんかC#のprivateとpublicで分けて書くよりインスタンスかそれともクラスかどちらに属しているのかわかりやすいなぁなんて言いながら書いていました。

それで、ふとclass.__doc__でコメントも参照できるよ!っていうのが書いてあったので、面白い機能だなと思ってこのFirstClassに適応してみました。

>>> print FirstClass.__doc__
ã³ã¡ã³ãã¯3éã¯ã©ã¼ãã¼ã·ã§ã³ã§

なんか文字化けしました。
とりあえずGoogleに聞くと、ファイルの先頭でutf-8encodingを指定したら良いよ、という記事が何個かヒットしたので試します。ちなみにこんなの。

# -*- encoding:utf-8 -*-

結果

>>> # -*- coding: utf-8 -*-
... 
... class FirstClass:
...     """コメントは3重クォーテーションで"""
...     ID = 0
...     def __init__(self,value,name):
...         """constructor!
...         基本的にインスタンス変数はコンストラクタで初期化しましょう
...         これはC#とかでも見習ったほうがいいかもしれん
...         """
...         self.data = value
...         FirstClass.ID += 1
...         self.id = FirstClass.ID
...         self.name = name
... 
...     def setdata(self,value):
...         self.data = value
...     def display(self):
...         print self.data
...         return
... 
  File "<stdin>", line 0
SyntaxError: encoding declaration in Unicode string

Unicode文字列なのになんでエンコード指定してくんの?ってことでいいんですかね。警告されました。どうやら、文字列の変数の中に日本語が入ってくる場合は先のエンコード指定をしてやればOKみたいなのですが、コメントアウト部分に日本語があるとそうは行かないみたいです…(ちょっとこの辺あってるかどうか微妙です。今のところの自分の想像)

なので他の方法を調べていたら、文字化けしたところだけデコードしてやればいいよっていうのがありました。文字列に対して、string.decode("<適当なエンコード>")としてやれば良いみたい。

>>> print FirstClass.__doc__.decode("utf-8")
コメントは3重クォーテーションで

なんかうまいこと行きました。

とりあえずこれで当分しのぎます。