Membuat kelas secara dinamis di Python

Katakanlah kita sedang membuat sebuah konstruksi bahasa sederhana berbasis Python untuk merancang sebuah daftar pertanyaan. Sebuah pertanyaan diwakilkan dengan sebuah kelas turunan dari kelas Pertanyaan dan pertanyaannya sendiri didefinisikan dalam atribut pertanyaan. Contohnya sebagai berikut.

class Nama(Pertanyaan):
    pertanyaan = "Siapa nama kamu?"

Bagi yang pernah memakai Django mungkin akan ingat dengan cara membuat kelas model untuk basis data.

Kelas Pertanyaan di atas memiliki sebuah fungsi untuk mencetak nama kelas dan isi dari atribut pertanyaan, seperti berikut.

class Pertanyaan:
    def cetak(self):
        print "Variabel  :", self.__class__.__name__
        print "Pertanyaan:", self.pertanyaan

Sehingga jika fungsi cetak() dari objek dari Nama dipanggil, akan keluar tulisan seperti berikut.

Variabel  : Nama
Pertanyaan: Siapa nama kamu?

Kode sumber sampai saat ini bisa dilihat di http://pastie.org/698881

Pendefinisian kelas secara manual, alias menulis langsung pada kode sumber, mungkin memang gampang. Namun bagaimana kalau daftar pertanyaan tidak dapat ditentukan dari awal sehingga harus membaca dari sebuah sumber tertentu, misalnya berkas daftar pertanyaan atau basis data?

Kelas-kelas pertanyaan ini ternyata dapat dibangun secara dinamis! Caranya yaitu dengan menggunakan fungsi type (referensi). Contohnya adalah seperti berikut.

kelas = type('Umur', (Pertanyaan, object, ), { 'pertanyaan': 'Berapa umurmu?' })
objek = kelas()
objek.cetak()

Keluaran yang dihasilkan adalah seperti berikut ini.

Variabel  : Umur
Pertanyaan: Berapa umurmu?

Persis sama seperti jika kita membua kelas Umur secara statis di kode sumber yang kita tulis!

Fungsi type ini selain berguna untuk mengecek tipe suatu objek, ternyata bisa digunakan juga untuk membuat sebuah tipe. Masukkan tiga buah parameter ke dalamnya untuk melakukannya.

  • Parameter 1: Nama tipe yang akan dibuat
  • Perameter 2: Daftar kelas induk dari kelas yg dibuat. Salah satu kelas induk harus merupakan turunan dari object. Kalau tidak ada, maka object harus dimasukkan ke dalam parameter 2 ini.
  • Parameter 3: Sebuah dictionary yang berisikan daftar atribut dari kelas baru ini.

Kode sumber lengkap dapat dilihat di http://pastie.org/698885.

Bermain dengan graf

Tanpa basa-basi, langsung aja buka http://github.com/fajran/graph-experiment/tree/master =D

Yang sudah ada itu struktur data sangat sederhana untuk graph, node, dan edge. Selain itu, ada juga fungsi layouting dengan teknik force-directed layout dg algoritma Fruchterman Reingold yg di-port dari Prefuse.

Berhubung dibuat pakai Python dan lagi teringat pengen nyoba Jython, maka saya jg sekalian nyoba ngebandingin Python dan Jython. Jython yang dipake adalah Jython 2.5b0. Ujicoba dilakukan di atas Ubuntu 8.04 32bit, Intel Core Duo 1.83GHz, RAM 2GB, aplikasi lain yg nyala yg mungkin mempengaruhi hasil adalah Eclipse (gak dipake, lupa ditutup aja =P), Banshee, dan Firefox. Inilah hasilnya..

Edge Node Python Jython
100 93 5.348 6.421
200 171 17.403 13.945
300 234 33.011 22.798
400 294 53.674 35.107
500 358 77.672 50.576

Waahh.. pake Jython hasilnya lebih cepet euy!

Oprek2 dikit, jadilah graph plotter yg dibuat pake Python Imaging Library. Source code udah ada di repo git yg disebut di atas. Berikut ini 5 gambar dari 5 graf yg dipake di uji coba di atas.

Mengelompokkan file berdasar tanggal

Mau mengelompokkan file berdasar tanggal? silakan coba pake skrip iseng-iseng ini =D coba aja langsung diintip di github.

Donlod dulu.. dan set supaya bisa dieksekusi.

$ wget -o group.py http://github.com/fajran/iseng/tree/master%2Fgroup-file-by-date%2Fgroup.py?raw=true
$ chmod +x group.py

Lalu jalankan skrip tsb tuk membuat skrip lain yang baru akan melakukan pengelompokkan dengan cara membuat direktori tanggal dan memindahkan file ke dalamnya.

$ ./group.py -s campuraduk/ -d rapijali/ > beberes.sh

Akan terbentuk file beberes.sh yang kalau dieksekusi maka file-file yang ada di direktori campuraduk akan dipindahkan ke dalam direktori rapijali.

Sebelum mengeksekusi beberes.sh silakan cek dulu isinya, sapa tau gak sesuai dengan hati nurani. Kalau udah puwas, ya langsung aja dijalanin.

$ chmod +x beberes.sh
$ ./beberes.sh

Semoga bermanfaat..

Bazaar di Nexenta

Bazaar (bzr) di Nexenta 1.0 udah terlalu jadul. Jadi enakan ngompile ndiri aja =D

  • Paket tambahan kalo mo ngompile..

    $ sudo apt-get install python-dev
  • Donlod bzr yg baru lalu di-extract

    $ wget --no-check-certificate 
      https://launchpad.net/bzr/1.9/1.9/+download/bzr-1.9.tar.gz
    $ tar xzf bzr-1.9.tar.gz
    $ cd bzr-1.9
  • Compile dan instal ke $HOME/sunos

    $ python setup.py install --prefix=$HOME/sunos

    sesuaikan target instalasi sesuai kebutuhan.

Instalasi kelar, sekarang atur2 path.

$ export PATH=$PATH:$HOME/sunos/bin
$ export PYTHONPATH=$PYTHONPATH:$HOME/sunos/lib/python2.4/site-packages