Kengo's blog

Technical articles about original projects, JVM, Static Analysis and TypeScript.

Pythonキャッチアップ記録

GW中はひたすらPython(CPython)のキャッチアップをしていました。
有名企業で利用されているだけのことはあり、高い生産性と自由度を兼ね備えた軽量言語であることを実感できました。
実行速度が充分高速ならば業務でも利用してみたいと思わせる言語です。

私が特徴として感じたこと

  • 多重継承やメタクラスや関数オブジェクトなど、Javaでは手が届かないことができる
  • 標準ライブラリが充実
    • CSVパーサ・CGI向けライブラリ・Tkinter etc.
    • 簡単にGUIプログラミングができるTkinterは魅力的だが、IDEによるサポートが無い(?)のが残念
    • DBMSとしてPostgreSQL, MySQL, Oracleなどを利用可能とのこと*1
  • 新しく使い始めるなら文字コードUnicodeに統一されたバージョン3.x系が好ましいのでは
  • プロパティが利用可能であり、インデント規約と相まってコードの可読性が高い
  • (私が今まで学習した)他の言語には見られないローカルルールが多いため、キャッチアップに時間を要した
    • インデントの統一
    • __で始まるメンバは見えないということにする(厳密にはアクセス可能)
    • クラスメソッドやインスタンスメソッドの第1引数に、自信を表すclsやselfを記述する必要がある

今後確認したい懸念点

  • 実行速度とメモリ消費量
  • 保証
    • 複数の実装があるが、動作が等しいことはどの程度保証されるのか?
    • マルチプラットフォームだが、動作が等しいことはどの程度保証されるのか?
    • こうした保証は誰が(どこが)しているのか?
  • マルチコアを活用する方法は?スレッドを明示的に利用する必要があるのか?

サンプルスクリプト

メタクラスの活用方法が未だ理解できていない実感があります。
Smalltalkに手を出すべきなのかもしれません。

# sample script to learn Python 3.0.1
# 2009.05.06 eller
# ** Sorry, this script won't run on Python 2.x. **

class Human(type):
    """ Human is a metaclass. """
    def __init__(cls, name, bases, dict):
        """ This method initializes an instance. """
        print('The %s class is created.' % name)

class Student(object, metaclass=Human):
    """ Student studies curriculum. """
    def __init__(self, name):
        """ This method initializes an instance. """
        self.__name = name
    def study(self, curriculum):
        """ The definition of instance method. """
        print('%s is studing %s.' % (self.name, curriculum))
    def __str__(self):
        """ This method works like toString() method of Java. """
        return 'student named %s' % self.name
    @property
    def name(self):
        """ The definition of property. **READ ONLY** """
        return self.__name

class SleepyStudent(Student):
    def study(self, curriculum):
        """ This definition overrides the super class's definition. """
        print('%s is sleeping.' % self.name)

class Teacher(object, metaclass=Human):
    def __init__(self, name):
        self.__name = name
    def __str__(self):
        return 'teacher named %s' % self.name
    def teach(self, curriculum, *students):
        print('%s is teaching %s to %s.' % \
            (self.name, curriculum, ', '.join(student.name for student in students)))
        for student in students:
            student.study(curriculum)
    @property
    def name(self):
        return self.__name

if __name__ == "__main__":
    peter  = Student('Peter')
    edmund = Student('Edmund')
    lucie  = SleepyStudent('Lucie')     # She'll sleep during a lesson.
    susan  = Teacher('Susan')
    print()
    susan.teach('English', peter, edmund, lucie)

実行結果

The Student class is created.
The SleepyStudent class is created.
The Teacher class is created.


Susan is teaching English to Peter, Edmund, Lucie.
Peter is studing English.
Edmund is studing English.
Lucie is sleeping.

*1:http://wiki.python.org/moin/DatabaseInterfaces