Expédition Python style Umemura Jour 1

Pour plus d'informations sur l'expédition Python de style Umemura, consultez "Expédition Python de style Umemura jour 0" !

Le premier jour de l'expédition, je voudrais continuer avec le thème "Explorer la fonction Builtin à partir du code source".

Quelle est la fonction Buitin? ??

Également appelée fonction intégrée. C'est une fonction intégrée qui peut être utilisée sans importation. Un endroit typique est l'impression. Veuillez vous référer au didacticiel pour une liste des fonctions intégrées. http://docs.python.jp/2/library/functions.html

Les fonctions importées et utilisées contrairement à la fonction Builtin (par exemple os.path) sont faciles à comprendre. En effet, il est enregistré au format .py (essentiellement) dans le dossier Lib à l'intérieur du dossier où Python est installé. D'autre part, la fonction Builtin est littéralement construite dans le fichier exécutable python, vous ne pouvez donc pas la trouver sans toucher le code source.

Jetons un œil au code source!

Frappons réellement le code source. Cette fois, j'ai téléchargé Python-3.6.0.tgz et j'ai jeté un coup d'œil à l'intérieur, mais comme je ne vérifie que la fonction Builtin, toute version devrait fonctionner. L'endroit est ici: https://www.python.org/downloads/source/

Si vous regardez le contenu, vous verrez un dossier contenant le code source pour l'installation de Python sur le système. (C'est vrai.) Le dossier de la fonction Builttin de cette fois est le suivant. /Python/bltinmodule.c

Jetons un coup d'œil à l'intérieur. Comment une source d'impression typique est-elle écrite? (Ligne 1744)

static PyObject *
builtin_print(PyObject *self, PyObject *args,  PyObject *kwds)
{
    static char *kwlist[] = {"sep", "end", "file", "flush", 0};
    static PyObject *dummy_args;
    PyObject *sep = NULL, *end = NULL, *file =  NULL, *flush = NULL;
    int i, err;
    ....

Lorsque vous créez un fichier exécutable Python en langage C, vous le construisez également en incorporant la fonction d'impression comme celle-ci, je vois.

Jetez un œil à la liste des fonctions intégrées

Vous pouvez voir une liste des fonctions intégrées dans le tableau builtin_methods. (Ligne 2613)

static PyMethodDef builtin_methods[] = {
{"__build_class__", (PyCFunction)builtin___build_class__,
 METH_VARARGS | METH_KEYWORDS, build_class_doc},
{"__import__",      (PyCFunction)builtin___import__, METH_VARARGS | METH_KEYWORDS, import_doc},
BUILTIN_ABS_METHODDEF
BUILTIN_ALL_METHODDEF
BUILTIN_ANY_METHODDEF
BUILTIN_ASCII_METHODDEF
BUILTIN_BIN_METHODDEF
BUILTIN_CALLABLE_METHODDEF
BUILTIN_CHR_METHODDEF
BUILTIN_COMPILE_METHODDEF
BUILTIN_DELATTR_METHODDEF
{"dir",             builtin_dir,        METH_VARARGS, dir_doc},
BUILTIN_DIVMOD_METHODDEF
BUILTIN_EVAL_METHODDEF
BUILTIN_EXEC_METHODDEF
BUILTIN_FORMAT_METHODDEF
{"getattr",         builtin_getattr,    METH_VARARGS, getattr_doc},
BUILTIN_GLOBALS_METHODDEF
BUILTIN_HASATTR_METHODDEF
BUILTIN_HASH_METHODDEF
BUILTIN_HEX_METHODDEF
BUILTIN_ID_METHODDEF
BUILTIN_INPUT_METHODDEF
BUILTIN_ISINSTANCE_METHODDEF
BUILTIN_ISSUBCLASS_METHODDEF
{"iter",            builtin_iter,       METH_VARARGS, iter_doc},
BUILTIN_LEN_METHODDEF
BUILTIN_LOCALS_METHODDEF
{"max",             (PyCFunction)builtin_max,        METH_VARARGS | METH_KEYWORDS, max_doc},
{"min",             (PyCFunction)builtin_min,        METH_VARARGS | METH_KEYWORDS, min_doc},
{"next",            (PyCFunction)builtin_next,       METH_VARARGS, next_doc},
BUILTIN_OCT_METHODDEF
BUILTIN_ORD_METHODDEF
BUILTIN_POW_METHODDEF
{"print",           (PyCFunction)builtin_print,      METH_VARARGS | METH_KEYWORDS, print_doc},
BUILTIN_REPR_METHODDEF
{"round",           (PyCFunction)builtin_round,      METH_VARARGS | METH_KEYWORDS, round_doc},
BUILTIN_SETATTR_METHODDEF
BUILTIN_SORTED_METHODDEF
BUILTIN_SUM_METHODDEF
{"vars",            builtin_vars,       METH_VARARGS, vars_doc},
{NULL,              NULL},
};

Hmm? Vous pouvez voir 2 modèles. L'une est une fonction qui décrit la structure, telle que l'impression. L'autre est une fonction qui a été remplacée par une variable. Le premier semble avoir le code source dans ce fichier c, mais où est le second?

La réponse était dans le fichier d'en-tête ci-dessous! /Python/clinic/bltinmodule.c.h

Par exemple, la fonction abs est ...

#define BUILTIN_ABS_METHODDEF    \
    {"abs", (PyCFunction)builtin_abs, METH_O, builtin_abs__doc__},

Je ne sais pas pourquoi la définition est divisée en deux ici. C'est peut-être facile à construire, mais je n'essaierai pas de le trouver cette fois.

Résumé

Comment la fonction Builtin explorait-elle le code source? Hmm? Est-ce insatisfaisant? Si c'est le cas, je suis désolé, mais je pense continuer le rapport qui examinait légèrement ce qui m'inquiétait un peu à ce niveau. Nous vous serions reconnaissants si vous pouviez vous entendre avec nous.

Recommended Posts

Expédition Python style Umemura jour 0
Expédition Python style Umemura Jour 1
Python Jour 1
Premier jour d'étude de Python
[1day1lang AdventCalender] jour4 Python
Défi Spartacamp Python 2019 Day2
[Introduction à Python3 Jour 1] Programmation et Python
[Introduction à Python3 Jour 14] Chapitre 7 Chaînes de caractères (7.1.1.1 à 7.1.1.4)
[Introduction à Python3 Jour 15] Chapitre 7 Chaînes de caractères (7.1.2-7.1.2.2)
[Introduction à Python3 Day 21] Chapitre 10 Système (10.1 à 10.5)