- فایل header با اسم و پسوند Python.h.
- توابع C که می خواهید به عنوان interface و الگوی پیاده سازی ماژول اختصاصی خود در اختیار توسعه دهنده قرار دهید.
- یک جدول که اسم توابع اختصاصی شما را به توابع C داخل افزونه (کتابخانه یا ماژول) نگاشت می کند (method mapping table).
- یک تابع سازنده جهت مقداردهی اولیه و نمونه سازی از کلاس (initialization function).
static PyObject *MyFunctionWithKeywords(PyObject *self,
PyObject *args,
PyObject *kw);
static PyObject *MyFunctionWithNoArgs( PyObject *self );
/* Do your stuff here. */
Py_RETURN_NONE;
}
char *ml_name;
PyCFunction ml_meth;
int ml_flags;
char *ml_doc;
};
- فیلد ml_name : اسم تابع پایتون.
- فیلد ml_meth : آدرس تابعی که هر یک از signature های نام برده در بخش قبلی را دارا می باشد.
- فیلد ml_flags : این فیلد به مفسر پایتون اعلان می کند که فیلد دوم (ml_meth) کدام یک از signature های نام برده را اتخاذ می کند :
- این flag معمولا مقداری از METH_VARARGS دارد.
- اگر می خواهید آرگومان های کلیدواژه ای را در تابع تزریق نمایید، این flag می تواند OR بیتی با METH_KEYWORDS را شامل شود.
- این flag همچنین می تواند مقدار METH_NOARGS را داشته باشد، بدین معنی که هیچ پارامتری به تابع فرستاده نمی شود.
- فیلد ml_doc : این docstring (رشته یا comment ای که توضیحی درباره ی کارایی تابع می دهد) تابع است. اگر برنامه نویس comment ای برای تابع تنظیم نکند، در آن صورت مقدار آن NULL خواهد بود.
{ "func", (PyCFunction)module_func, METH_NOARGS, NULL },
{ NULL, NULL, 0, NULL }
};
Py_InitModule3(func, module_methods, "docstring...");
}
- پارامتر func : تابعی است که قرار است export و به اصطلاح خروجی گرفته شود.
- پارامتر module_methods : اسم جدول نگاشت تابع (mapping table) که در بالا به آن اشاره شد.
- پارامتر docstring : این پارامتر همان رشته ی متنی و comment ای است که جهت ارائه ی توضیح درباره ی قابلیت تابع در افزونه ی اختصاصی درج می شود.
static PyObject *module_func(PyObject *self, PyObject *args) {
/* Do your stuff here. */
Py_RETURN_NONE;
}
static PyMethodDef module_methods[ ] = {
{ "func", (PyCFunction)module_func, METH_NOARGS, NULL },
{ NULL, NULL, 0, NULL }
};
PyMODINIT_FUNC initModule() {
Py_InitModule3(func, module_methods, "docstring...");
}
< /python.h>
static PyObject* helloworld(PyObject* self)
{
return Py_BuildValue("s", "Hello, Python extensions!!");
}
static char helloworld_docs[ ] =
"helloworld( ): Any message you want to put here!!n"
static PyMethodDef helloworld_funcs[ ] = {
{"helloworld", (PyCFunction)helloworld,
METH_NOARGS, helloworld_docs},
{NULL}
};
void inithelloworld(void)
{
Py_InitModule3("helloworld", helloworld_funcs,
"Extension module example!");
}
< /python.h>
setup(name='helloworld', version='1.0',
ext_modules=[Extension('helloworld', ['hello.c'])])
import helloworld
print helloworld.helloworld()
/* Parse args and do something interesting here. */
Py_RETURN_NONE;
}
{ "func", (PyCFunction)module_func, METH_NOARGS, NULL },
{ "func", module_func, METH_VARARGS, NULL },
{ NULL, NULL, 0, NULL }
};
int i;
double d;
char *s;
if (!PyArg_ParseTuple(args, "ids", &i, &d, &s)) {
return NULL;
}
/* Do something interesting here. */
Py_RETURN_NONE;
}
module.func(i=1, d=2.0, s="three")
module.func(s="three", d=2.0, i=1)
- کد c در پایتون معادل char در زبان C : یک رشته پایتون با طول 1 (رشته ی حاوی یک کاراکتر) معادل char در C می شود.
- کد d در پایتون معادل double در زبان C : یک مقدار عددی float (ممیز و اعشاری) که معادل double (اعشاری با دقت بیشتر) در C محسوب می شود.
- کد f در پایتون معادل float در زبان C : یک float (مقدار عددی اعشاری از نوع float) در پایتون معادل float در C محسوب می شود.
- کد i در پایتون معادل int در زبان C : یک int (نوع عدد صحیح) معادل long در زبان C درنظر گرفته می شود.
- کد l در پایتون معادل long در زبان C : یک int در زبان پایتون معادل نوع داده ای long در زبان C در نظر گرفته می شود.
- کد L در پایتون معادل long long در زبان C : یک int یا نوع داده ای عدد صحیح در زبان پایتون، معادل long long در زبان C محسوب می شود.
- کد O در پایتون معادل PyObject* در زبان C : یک اشاره گر غیر NULL به آرگومان Python بازگردانی می کند.
- کد s در پایتون معادل char* در زبان C : رشته پایتون بدون مقادیر null جاسازی شده (embedded) به char* در زبان C فرمت دهی / تبدیل می شود.
- کد s# در پایتون معادل char*+int در زبان C : رشته Python را به آدرس و طول سازگار در C تبدیل می کند.
- کد t# در پایتون معادل char*+int در زبان C : کاربردی مشابه s# دارد با این تفاوت که هر آبجکتی که اینترفیس read-only را پیاده سازی کند، می پذیرد.
- کد u در پایتون معادل Py_UNICODE* در زبان C : کاراکترهای Unicode (null-terminated buffer) مستقر در بافر که انتهای آن به null ختم می شود را به آبجکت Unicode پایتون تبدیل می کند.
- کد u# در پایتون معادل Py_UNICODE*+int در زبان C : نوع دیگر از u که در دو متغیر C ذخیره می شود، اولی یک اشاره گر به آدرس Unicode مستقر در بافر و دومی طول آن.
- کد w# در پایتون معادل char*+int در زبان C : مشابه s#، اما هر آّبجکتی که اینترفیس read/write بافر را پیاده سازی می کند، پذیرفته و با آن سازگاری دارد.
- کد z در پایتون معادل char* در زبان C : کاربری مشابه s دارد با این تفاوت که None نیز می پذیرد (char* زبان C را بر روی NULL تنظیم می کند).
- کد z# در پایتون معادل char*+int در زبان C : کاربردی مشابه s# دارد اما None نیز می پذیرد (char* زبان C را روی NULL تنظیم می نماید).
- کد (...) در پایتون معادل as per ... در زبان C : یک دنباله (sequence) پایتون که هر آیتم در آن یک آرگومان در نظر گرفته می شود.
- کد | در پایتون معادل double در زبان C : آرگومان های زیر اختیاری می باشد.
- کد : در پایتون معادل double در زبان C : قبل از اسم تابع در پیغام های خطا قرار می گیرد.
- کد ; در پایتون معادل double در زبان C : قبل از درج کل متن پیغام خطا قرار می گیرد.
int a;
int b;
if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
return NULL;
}
return Py_BuildValue("i", a + b);
}
return (a + b)
int a;
int b;
if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
return NULL;
}
return Py_BuildValue("ii", a + b, a - b);
}
return (a + b, a - b)
- کد c در پایتون معادل char در زبان C : یک char زبان C، به رشته ای با طول یک کاراکتر تبدیل می شود.
- کد d در پایتون معادل double در زبان C : یک نوع عددی double زبان C، به float در پایتون تبدیل می شود.
- کد f در پایتون معادل float در زبان C : یک float یا نوع عددی اعشاری زبان C، به همان float در پایتون تبدیل می شود.
- کد i در پایتون معادل int در زبان C : یک Int زبان C به همان int (نوع عددی صحیح) در پایتون تبدیل می شود.
- کد l در پایتون معادل long در زبان C : یک long در زبان C به int در پایتون تبدیل می شود.
- کد N در پایتون معادل PyObject* در زبان C : یک آبجکت پایتون ارسال کرده ولی reference count (تعداد دفعاتی که آبجکت مورد نظر به آن دسترسی صورت می گیرد) آن را افزایش نمی دهد.
- کد O در پایتون معادل PyObject* در زبان C : یک آبجکت پایتون ارسال کرده و reference count آن را طبق انتظار یک واحد افزایش می دهد.
- کد O& در پایتون معادل convert+void* در زبان C : رشته پایتون بدون مقادیر null جاسازی شده (embedded) به char* در زبان C فرمت دهی / تبدیل می شود.
- کد s در پایتون معادل char* در زبان C : یک char* که در انتهای خود 0 داشته را به رشته ی Python تبدیل می نماید یا NULL را به None.
- کد s# در پایتون معادل char*+int در زبان C : یک رشته ی C و طول (length) آن را به یک آبجکت Python تبدیل می کند. اگر اشاره گر از نوع string (string pointer) برابر NULL باشد، طول یا length نادیده گرفته شده و None در خروجی بازگردانی می کند.
- کد u در پایتون معادل Py_UNICODE* در زبان C : یک رشته که در سطح زبان C تعریف شده و انتهای آن مقدار NULL وجود دارد را به یونیکد پایتون تبدیل کرده و اگر NULL بود آن را به None تبدیل می کند. Buffer ای از داده های Unicode که انتهای آن null وجود دارد را به آبجکت پایتون تبدیل می کند. اگر Unicode buffer برابر NULL بود، در خروجی None بازیابی می شود.
- کد u# در پایتون معادل Py_UNICODE*+int در زبان C : یک رشته ی تعریف شده در سطح C و طول آن را به آبجکت Unicode پایتون تبدیل می کند یا NULL را به None تبدیل می کند. به عبارت دیگر، یک Unicode (که استانداردهای USC-2 یا UCS-4) مستقر در buffer یا حافظه میانی و طول (length) آن را به آبجکت Unicode پایتون تبدیل می کند. اگر اشاره گر به Unicode موجود در buffer برابر NULL بود، طول آن نادیده گرفته شده و None را در خروجی برمی گرداند.
- کد w# در پایتون معادل char*+int در زبان C : مشابه s#، با این تفاوت که هر آبجکتی که اینترفیس read-write را پیاده سازی می کند، می پذیرد. متغیر char * طوری تنظیم شده که به اولین بایت از buffer اشاره کند و Py_ssize_t را بر روی طول buffer تنظیم می کند.
- کد z در پایتون معادل char* در زبان C : مشابه s، با این تفاوت که None نیز می پذیرد (char* در C را روی NULL تنظیم می کند).
- کد z# در پایتون معادل char*+int در زبان C : کاربردی مشابه s# دارد (char* در C را بر روی NULL تنظیم می کند).
- کد (...) در پایتون معادل as per ... در زبان C : از دنباله ای از مقادیر C، یک متغیر tuple در پایتون می سازد.
- کد [...] در پایتون معادل as per ... در زبان C : از مقادیر C، یک لیست (list) در پایتون تولید می کند.
- کد {...} در پایتون معادل as per ... در زبان C : از دنباله ای از مقادیر C، یک dictionary که المان های آن به صورت متناوب، کلید و مقدار، سازمان دهی شده، ایجاد می کند.