Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования PythonΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 52

Автор Π ΠΎΠΌΠ°Π½ Π‘ΡƒΠ·ΠΈ

Под ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ здСсь понимаСтся Π½Π°Π±ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ класс для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ со своими экзСмплярами. Π­Ρ‚ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ доступны Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· Python (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, len(a) Π΄Π°Π΅Ρ‚ Π΄Π»ΠΈΠ½Ρƒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ), Π½ΠΎ ΠΈ ΠΈΠ· ΠΊΠΎΠ΄Π° Π½Π° C (PySequence_Length()).

НаписаниС модуля Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ

Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Python Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ нСчасто, Ρ‚ΠΎ Π΅Π³ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ΠΏΡƒΡ‚Π΅ΠΌ написания ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π½Π° C/C++ - довольно распространСнная ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°. Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Python Π±Ρ‹Π» Π½Π°Ρ†Π΅Π»Π΅Π½ Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, поэтому Π² настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ C/C++-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ привязки ΠΊ Python.

ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠ° ΠΊ Python, хотя ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π°, всС ΠΆΠ΅ это процСсс творчСский. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли прСдполагаСтся интСнсивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π² Python, Π΅Π΅ привязку ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² Ρ…ΠΎΠ΄Π΅ привязки Π±ΡƒΠ΄Π΅Ρ‚ сдСлана ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎβ€“ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Π°Ρ надстройка ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½Ρ‹Π΅ измСнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ позволят ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ использованиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ привСсти Π²Ρ‹Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΈΠ· исходного ΠΊΠΎΠ΄Π° модуля md5, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для получСния md5–дайдТСста. ΠœΠΎΠ΄ΡƒΠ»ΡŒ приводится Π² цСлях ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, с сокращСниями). ΠœΠΎΠ΄ΡƒΠ»ΡŒ Π²Π²ΠΎΠ΄ΠΈΡ‚ собствСнный Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, MD5Type, поэтому ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π½ΠΎ ΠΈ способ описания встроСнного Ρ‚ΠΈΠΏΠ°. Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… этого курса Π½Π΅ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ всС тонкости программирования ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π΄ΡƒΡ… этого занятия. На ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π°Π²Ρ‚ΠΎΡ€Π° курса Π»Π΅ΠΊΡ†ΠΈΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ слэш //:

// Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹

#include "Python.h"

#include "md5.h"


// Π’ частности, Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ md5.h Π΅ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ опрСдСлСния:

// typedef unsigned char *POINTER;

// typedef unsigned int UINT4;


// typedef struct {

// UINT4 state[4]; /* state (ABCD) */

// UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */

// unsigned char buffer[64]; /* input buffer */

// } MD5_CTX;


// Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° MD5type

typedef struct {

 PyObject_HEAD

 MD5_CTX md5; /* the context holder */

} md5object;


// ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° MD5type

static PyTypeObject MD5type;


// ΠœΠ°ΠΊΡ€ΠΎΡ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠ° MD5type

#define is_md5object(v) ((v)->ob_type == &MD5type)


// ΠŸΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΈΠΏΠ° MD5type

static md5object * newmd5object(void) {

 md5object *md5p;

 md5p = PyObject_New(md5object, &MD5type);

 if (md5p == NULL)

  return NULL; // Π½Π΅ Ρ…Π²Π°Ρ‚ΠΈΠ»ΠΎ памяти

 MD5Init(&md5p->md5); // инициализация

 return md5p;

}


// ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²


// ОсвобоТдСниС памяти из–под ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

static void md5_dealloc(md5object *md5p) { PyObject_Del(md5p); }


static PyObject * md5_update(md5object *self, PyObject *args) {

 unsigned char *cp;

 int len;


 // Ρ€Π°Π·Π±ΠΎΡ€ строки Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ². Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

 // s# - ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, строка (заданная ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΈ Π΄Π»ΠΈΠ½ΠΎΠΉ)

 // : - Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ

 // update β€” Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°

 if (!PyArg_ParseTuple(args, "s#:update", &cp, &len))

  return NULL;


 MD5Update(&self->md5, cp, len);


 // Π”Π°ΠΆΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ None Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ увСличСния счСтчика ссылок

 Py_INCREF(Py_None);

 return Py_None;

}


// Π‘Ρ‚Ρ€ΠΎΠΊΠ° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° update

PyDoc_STRVAR(update_doc,

"update (arg)\n\

\n\

Update the md5 object with the string arg. Repeated calls are\n\

equivalent to a single call with the concatenation of all the\n\

arguments.");


// ΠœΠ΅Ρ‚ΠΎΠ΄ digest

static PyObject * md5_digest(md5object *self) {

 MD5_CTX mdContext;

 unsigned char aDigest[16];


 /* make a temporary copy, and perform the final */

 mdContext = self->md5;

 MD5Final(aDigest, &mdContext);


 // Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ возвращаСтся Π² Π²ΠΈΠ΄Π΅ строки

 return PyString_FromStringAndSize((char *)aDigest, 16);

}


// ΠΈ строка Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ

PyDoc_STRVAR(digest_doc, "digest() -> string\n\ ...");


static PyObject * md5_hexdigest(md5object *self) {

 // РСализация ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π° C

}


PyDoc_STRVAR(hexdigest_doc, "hexdigest() -> string\n...");


// Π—Π΄Π΅ΡΡŒ Π±Ρ‹Π»ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° copy()


// ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² сборС.

// Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° указываСтся Π½Π°Π·Π²Π°Π½ΠΈΠ΅, имя ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π° C

// (с ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ ΠΊ Ρ‚ΠΈΠΏΡƒ PyCFunction), способ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²:

// METH_VARARGS (ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ кол–во) ΠΈΠ»ΠΈ METH_NOARGS (Π½Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²)

// Π’ ΠΊΠΎΠ½Ρ†Π΅ массива β€” ΠΌΠ΅Ρ‚ΠΊΠ° окончания спиcΠΊΠ° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

static PyMethodDef md5_methods[] = {

 {"update", (PyCFunction)md5_update, METH_VARARGS, update_doc},

 {"digest", (PyCFunction)md5_digest, METH_NOARGS, digest_doc},

 {"hexdigest", (PyCFunction)md5_hexdigest, METH_NOARGS, hexdigest_doc},

 {"copy", (PyCFunction)md5_copy, METH_NOARGS, copy_doc},

 {NULL, NULL} /* sentinel */

};


// Атрибуты md5β€“ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° обслуТиваСт эта функция, рСализуя ΠΌΠ΅Ρ‚ΠΎΠ΄

// getattr.

static PyObject * md5_getattr(md5object *self, char *name) {

 // атрибут–данноС digest_size

 if (strcmp(name, "digest_size") == 0) {

  return PyInt_FromLong(16);

 }

 // поиск атрибута–мСтода вСдСтся Π² спискС

 return Py_FindMethod(md5_methods, (PyObject *)self, name);

}


// Π‘Ρ‚Ρ€ΠΎΠΊΠ° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΊ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ md5

PyDoc_STRVAR(module_doc, "This module implements ...");


// Π‘Ρ‚Ρ€ΠΎΠΊΠ° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΊ классу md5

PyDoc_STRVAR(md5type_doc, "An md5 represents the object...");


// Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° MD5type с описаниями для ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°

static PyTypeObject MD5type = {

 PyObject_HEAD_INIT(NULL)

 0, /*ob_size*/

 "md5.md5", /*tp_name*/

 sizeof(md5object), /*tp_size*/

 0, /*tp_itemsize*/

 /* methods */

 (destructor)md5_dealloc, /*tp_dealloc*/

 0, /*tp_print*/

 (getattrfunc)md5_getattr, /*tp_getattr*/

 0, /*tp_setattr*/

 0, /*tp_compare*/

 0, /*tp_repr*/

 0, /*tp_as_number*/

 0, /*tp_as_sequence*/

 0, /*tp_as_mapping*/

 0, /*tp_hash*/

 0, /*tp_call*/

 0, /*tp_str*/

 0, /*tp_getattro*/

 0, /*tp_setattro*/

 0, /*tp_as_buffer*/

 0, /*tp_xxx4*/

 md5type_doc, /*tp_doc*/

};


// Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ модуля md5:


// Ѐункция new() для получСния Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΈΠΏΠ° md5type

static PyObject * MD5_new(PyObject *self, PyObject *args) {

 md5object *md5p;

 unsigned char *cp = NULL;

 int len = 0;


 // Π Π°Π·Π±ΠΎΡ€ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π—Π΄Π΅ΡΡŒ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Π°Ρ Ρ‡Π΅Ρ€Ρ‚Π°

 // Π² строкС Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅

 // списка ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

 // ΠžΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ β€” ΠΊΠ°ΠΊ ΠΈ Π²Ρ‹ΡˆΠ΅: s# - строка, послС : β€” имя

 if (!PyArg_ParseTuple(args, "|s#:new", &cp, &len))

  return NULL;


 if ((md5p = newmd5object()) == NULL)

  return NULL;


 // Если Π±Ρ‹Π» Π·Π°Π΄Π°Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ cp:

  if (cp)

   MD5Update(&md5p->md5, cp, len);


 return (PyObject *)md5p;

}


// Π‘Ρ‚Ρ€ΠΎΠΊΠ° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ для new()

PyDoc_STRVAR(new_doc, "new([arg]) -> md5 object ...");


// Бписок Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ экспортируСт

static PyMethodDef md5_functions[] = {

 {"new", (PyCFunction)MD5_new, METH_VARARGS, new_doc},

 {"md5", (PyCFunction)MD5_new, METH_VARARGS, new_doc},

 {NULL, NULL} /* Sentinel */

};

// Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ md5 β€” Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ new. Π­Ρ‚Π° функция оставлСна для

// ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости со старым ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ md5


// Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ модуля

PyMODINIT_FUNC initmd5(void) {

 PyObject *m, *d;


 MD5type.ob_type = &PyType_Type;

 // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ

 m = Py_InitModule3("md5", md5_functions, module_doc);

 // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ модуля

 d = PyModule_GetDict(m);

 // ДобавляСтся Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ MD5Type (Ρ‚ΠΈΠΏ md5β€“ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°) ΠΊ ΡΠ»ΠΎΠ²Π°Ρ€ΡŽ

 PyDict_SetItemString(d, "MD5Type", (PyObject *)&MD5type);

 // ДобавляСтся цСлая константа digest_size ΠΊ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ

 PyModule_AddIntConstant(m, "digest_size", 16);

}

На основС этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ собствСнныС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, ознакомившись с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΠΎ C/API ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Β«Extending and EmbeddingΒ» (Β«Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ΠΈ встраиваниС») ΠΈΠ· стандартной поставки Python. ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ ΠΊ созданию своСго модуля, слСдуСт ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ это цСлСсообразно: подходящСго модуля Π΅Ρ‰Π΅ Π½Π΅ создано ΠΈ рСализация Π² Π²ΠΈΠ΄Π΅ чистого Python нСэффСктивна. Если создан Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² поставку Python. Для этого Π½ΡƒΠΆΠ½ΠΎ просто ΡΠ²ΡΠ·Π°Ρ‚ΡŒΡΡ с ΠΊΠ΅ΠΌβ€“Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΈΠ· Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΠΎ элСктронной ΠΏΠΎΡ‡Ρ‚Π΅ ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π² Π²ΠΈΠ΄Π΅ Β«ΠΏΠ°Ρ‚Ρ‡Π°Β» Ρ‡Π΅Ρ€Π΅Π· http://sourceforge.net.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ встраивания ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° C

Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ встроСн Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° C с использованиСм C API. Π­Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ всСго дСмонстрируСт ΡƒΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: