Python - Ekstensi Lanjutan: Panduan untuk Pemula

Halo, para programmer Python yang aspiratif! Hari ini, kita akan melakukan perjalanan yang menyegarkan ke dunia ekstensi Python. Jangan khawatir jika Anda baru mengenal pemrograman - saya akan menjadi pemandu yang ramah, menjelaskan semua hal langkah demi langkah. Jadi, mari kita mulai!

Python - Further Extensions

Apa itu Ekstensi Python?

Sebelum kita mulai, mari kita mengerti apa itu ekstensi Python. Bayangkan Python sebagai pisau Army Swiss. Sudah cukup berguna, tetapi kadang-kadang Anda butuh alat yang tidak ada di sana. Itu tempat ekstensi berfungsi - mereka seperti menambahkan alat baru ke pisau Army Swiss Python Anda.

Prasyarat untuk Menulis Ekstensi

Sekarang, saya tahu Anda tidak sabar untuk memulai, tetapi ada beberapa hal yang kita perlu siapkan terlebih dahulu. Itu seperti mempersiapkan dapur Anda sebelum memasak makan malam gourmet. Berikut ini adalah apa yang Anda butuhkan:

  1. Python terinstal di komputer Anda
  2. Sebuah pengkompiler C (seperti GCC di Linux atau Visual Studio di Windows)
  3. Header dan pustaka pengembangan Python

Jangan khawatir jika ini terdengar rumit. Kebanyakan instalasi Python datang dengan apa yang Anda butuhkan, dan saya akan menjelaskan setiap pengaturan tambahan.

Pandangan Pertama pada Ekstensi Python

Mari kita mulai dengan contoh sederhana. Bayangkan jika kita ingin membuat fungsi yang menambahkan dua angka, tetapi ingin itu super cepat. Kita dapat menulis ini dalam C dan menggunakannya di Python. Ini adalah seperti apa yang mungkin akan terlihat:

#include <Python.h>

static PyObject* add_numbers(PyObject* self, PyObject* args) {
int a, b;
if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
return NULL;
}
return Py_BuildValue("i", a + b);
}

static PyMethodDef MyMethods[] = {
{"add", add_numbers, METH_VARARGS, "Add two numbers."},
{NULL, NULL, 0, NULL}
};

static struct PyModuleDef mymodule = {
PyModuleDef_HEAD_INIT,
"mymodule",
"A simple module that adds numbers",
-1,
MyMethods
};

PyMODINIT_FUNC PyInit_mymodule(void) {
return PyModule_Create(&mymodule);
}

Jangan panik jika ini terlihat seperti kalimat yang aneh saat ini. Kita akan memecahkan itu bagian demi bagian.

Berkas Header Python.h

Baris pertama kode kita adalah:

#include <Python.h>

Ini seperti mengatakan ke program C kita, "Hey, kita akan bekerja dengan Python di sini!" Ini menyertakan semua definisi dan fungsi yang kita butuhkan untuk membuat ekstensi Python.

Fungsi C

Berikutnya, kita memiliki fungsi C kita:

static PyObject* add_numbers(PyObject* self, PyObject* args) {
int a, b;
if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
return NULL;
}
return Py_BuildValue("i", a + b);
}

Fungsi ini mengambil dua objek Python sebagai input, mengekstrak dua integer dari mereka, menambahkannya bersama, dan mengembalikan hasilnya sebagai objek Python. Ini seperti seorang penerjemah antara C dan Python.

Tabel Pemetaan Metode

static PyMethodDef MyMethods[] = {
{"add", add_numbers, METH_VARARGS, "Add two numbers."},
{NULL, NULL, 0, NULL}
};

Tabel ini seperti menu untuk modul Python kita. Ini mengatakan ke Python, "Ini adalah fungsi yang tersedia di modul ini." Dalam kasus ini, kita menawarkan satu fungsi bernama "add".

Fungsi Inisialisasi

PyMODINIT_FUNC PyInit_mymodule(void) {
return PyModule_Create(&mymodule);
}

Fungsi ini dipanggil ketika Python mengimpor modul kita. Ini seperti pembukaan besar dari toko baru - mengatur semua hal dan membuat modul kita siap untuk digunakan.

Membangun dan Menginstal Ekstensi

Sekarang bahwa kita telah menulis ekstensi kita, kita perlu untuk membangunnya. Proses ini mengubah kode C kita menjadi sesuatu yang Python dapat menggunakan. Ini seperti membakar kue - kita telah mencampurkan bahan-bahan, sekarang kita perlu untuk meletakkannya di atas kompor.

Kita biasanya menggunakan berkas setup.py untuk ini:

from distutils.core import setup, Extension

module = Extension('mymodule', sources = ['mymodule.c'])

setup(name = 'MyModule',
version = '1.0',
description = 'This is a demo package',
ext_modules = [module])

Untuk membangun ekstensi, Anda akan menjalankan:

python setup.py build

Mengimpor Ekstensi

Setelah dibangun, Anda dapat menggunakan modul baru Anda seperti semua modul Python lainnya:

import mymodule

result = mymodule.add(5, 3)
print(result)  # Outputs: 8

Apakah itu keren? Anda baru saja menggunakan fungsi C di Python!

Mengirimkan Parameter Fungsi

Mari berbicara sedikit tentang bagaimana kita mengirimkan parameter dari Python ke C. Ingat baris ini?

if (!PyArg_ParseTuple(args, "ii", &a, &b))

Fungsi PyArg_ParseTuple

Fungsi ini adalah kunci untuk mengerti bagaimana parameter dikirim. Ini seperti petugas imigrasi, memeriksa dan memproses semua yang datang ke fungsi C kita dari Python.

"ii" di dalam fungsi mengatakan untuk mengharapkan dua integer. Jika Anda ingin mengirim string dan float, Anda akan menggunakan "sf" sebagai gantinya. Berikut ini adalah tabel yang praktis dari pengenal format:

Pengenal Format Tipe Python Tipe C
i int int
l long long
f float float
d float double
s str char*
O any object PyObject*

Mengembalikan Nilai

Seperti kita perlu memperhatikan data yang masuk dengan seksama, kita juga perlu mengemas nilai kembali kita dengan benar.

Fungsi Py_BuildValue

Fungsi ini seperti pembungkus hadiah untuk nilai C kita, membuat merekacantik untuk Python menerima. Ini adalah bagaimana itu bekerja:

return Py_BuildValue("i", a + b);

"I" mengatakan ke Py_BuildValue untuk membuat objek integer. Jika kita ingin mengembalikan string, kita akan menggunakan "s" sebagai gantinya.

Dan itu adalah! Anda baru saja mengambil langkah pertama Anda ke dunia ekstensi Python. Ingat, praktek membuat perfect. Cobalah menulis ekstensi Anda sendiri yang sederhana, bermain dengan jenis data yang berbeda, dan yang paling penting, bersenang-senang!

Ekstensi Python membuka kesempatan yang baru untuk kemungkinan, memungkinkan Anda untuk mengoptimalkan bagian kritis kode Anda atau menghubungkan dengan pustaka C yang ada. Ini adalah alat yang kuat dalam toolkit pemrograman Anda.

Selamat coding, dan sampaijumpa berikutnya, terus eksplor dan belajar!

Credits: Image by storyset