da API e simplesmente retorna o fatorial de um determinado numero.Toda funcao do tipo: Py_As, como em PyFloat_AsDouble converte do tipo em python pro tipo em C (no caso desta ultima converte um float em Python pra um double em C). E as funcoes que ao inves do As possuem o From, como em PyFloat_FromDouble convertem do tipo em C pro tipo em Python.Toda funcao que sera usada pelo Python tem como primeiro parametro um self, que e o contexto/namespace da funcao. As funcoes raiz_quadrada e fatorial recebem apenas um parametro, porem o self e obrigatorio e nao conta no numero de parametros, e como se nao existisse na definicao da funcao.Todo modulo tem uma definicao de metodos, que sao declarados em um array do tipo PyMethodDef que deve ter como ultimo elemento uma struct com pelo menos NULL e NULL pra indicar o fim do array com as definicoes. No caso da variavel funcoes_matematicas as duas primeiras structs tem como primeiro elemento o nome do metodo, como segundo a funcao em C (que usa a Python/C API) que e responsavel pelo metodo, o terceiro e uma macro indicando o numero de parametros e o quarto e ultimo e a docstring, que nos nao colocamos e que por padrao e vazia. No caso onde ha apenas um parametro usa-se METH_O para evitar parsing manual de parametros.Para facilitar, entenda PyMethodDef como definido da seguinte maneira:typedef struct { char *nome; PyCFunction funcao; int flags; char *docstring;} PyMethodDef;Vale falar um pouco sobre essa indicacao dos parametros atraves de flags. Na API voce pode usar algumas indicacoes de numero de parametros atraves de flags, dentre as mais usadas: METH_VARARGS, METH_KEYWORDS, METH_O e METH_NOARGS. Os dois primeiros sao bem autoexplicaveis. Neles e necessario fazer o parsing manual dos parametros, mesmo que so tenha sido passado um. Pra facilitar nossa vida foi usado METH_O que significa que sera recebido apenas um parametro.Outro ponto e o casting pra PyCFunction. O casting foi usado pra evitar warnings do compilador e nada mais.Como todo modulo precisa de uma funcao de inicializacao do modulo, foi criada a funcao initmatematica, que dentro dela e inicializado o modulo matematica que contem funcoes_matematicas como os metodos do modulo.Eu usei o gcc pra gerar o modulo e o python interativo pra mostrar o uso:hugo@hugo-laptop:~/pythoncapi$ gcc -shared -o matematica.so\> matematica.c -I/usr/include/python2.5 -lmhugo@hugo-laptop:~/pythoncapi$ pythonPython 2.5.2 (r252:60911, Jan 20 2010, 23:16:55)[GCC 4.3.2] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> import matematica>>> matematica.fatorial(5)120>>> matematica.raiz_quadrada(2)1.4142135623730951>>>A opcao -shared do gcc gera um objeto sem linkage e a -lm e pra linkar a biblioteca matematica.ReferenciasQuando eu comecei a estudar a Python/C API foi pela documentacao oficial do Python 2.5, o qual eu tinha baixado o fonte. Porem, pelo site docs.python.org e possivel acessar a documentacao oficial da API da ultima versao do Python (atualmente 2.6): http://docs.python.org/c-api. Atualmente eu tenho usado o pdf Python/C API Reference Manual pra fazer consultas e o mesmo esta acessivel tambem pela pagina da API da versao 2.5 da linguagem: http://www.python.org/doc/2.5.2/api/api.html.Esse texto termina aqui, porem tentarei em breve escrever mais sobre a Python/C API e sobre