Python-Expeditionstag im Umemura-Stil 1

Weitere Informationen zur Python-Expedition im Umemura-Stil finden Sie unter Python-Expeditionstag im Umemura-Stil 0 !

Am ersten Tag der Expedition möchte ich mit dem Thema "Erkunden der eingebauten Funktion aus dem Quellcode" fortfahren.

Was ist die Buitin-Funktion? ??

Wird auch als integrierte Funktion bezeichnet. Es ist eine integrierte Funktion, die ohne Import verwendet werden kann. Ein typischer Ort ist der Druck. Im Tutorial finden Sie eine Liste der integrierten Funktionen. http://docs.python.jp/2/library/functions.html

Funktionen, die im Gegensatz zur integrierten Funktion (z. B. os.path) importiert und verwendet werden, sind leicht zu verstehen. Dies liegt daran, dass es (im Grunde genommen) im .py-Format im Lib-Ordner in dem Ordner gespeichert ist, in dem Python installiert ist. Auf der anderen Seite ist die eingebaute Funktion buchstäblich in der ausführbaren Python-Datei enthalten, sodass Sie sie nicht finden können, ohne den Quellcode zu treffen.

Werfen wir einen Blick auf den Quellcode!

Lassen Sie uns tatsächlich den Quellcode treffen. Dieses Mal habe ich Python-3.6.0.tgz heruntergeladen und einen Blick hinein geworfen, aber da ich nur die eingebaute Funktion überprüfe, sollte jede Version in Ordnung sein. Der Ort ist hier: https://www.python.org/downloads/source/

Wenn Sie sich den Inhalt ansehen, sehen Sie einen Ordner mit dem Quellcode für die Installation von Python auf dem System. (Richtig.) Der Ordner der Builttin-Funktion dieser Zeit lautet wie folgt. /Python/bltinmodule.c

Werfen wir einen Blick hinein. Wie ist eine typische Druckquelle geschrieben? (Linie 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;
    ....

Wenn Sie eine ausführbare Python-Datei in C-Sprache erstellen, erstellen Sie sie auch, indem Sie die Druckfunktion wie folgt integrieren.

Schauen Sie sich die Liste der integrierten Funktionen an

Sie können eine Liste der integrierten Funktionen im Array builtin_methods anzeigen. (Zeile 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? Sie können 2 Muster sehen. Eine ist eine Funktion, die die Struktur beschreibt, z. B. Drucken. Die andere ist eine Funktion, die durch eine Variable ersetzt wurde. Ersteres scheint den Quellcode in dieser c-Datei zu haben, aber wo ist Letzteres?

Die Antwort war in der Header-Datei unten! /Python/clinic/bltinmodule.c.h

Zum Beispiel ist die abs-Funktion ...

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

Ich weiß nicht, warum die Definition hier zweigeteilt ist. Es mag leicht zu bauen sein, aber ich werde diesmal nicht versuchen, es zu finden.

Zusammenfassung

Wie hat die Builtin-Funktion den Quellcode untersucht? Hmm? Ist es unbefriedigend? Wenn ja, tut es mir leid, aber ich denke darüber nach, den Bericht fortzusetzen, in dem leicht untersucht wurde, worüber ich auf dieser Ebene ein wenig besorgt war. Wir würden uns freuen, wenn Sie mit uns auskommen könnten.

Recommended Posts

Python-Expeditionstag im Umemura-Stil 0
Python-Expeditionstag im Umemura-Stil 1
Python Tag 1
Erster Tag des Python-Studiums
[1day1lang AdventCalender] day4 Python
Spartacamp Python 2019 Day2 Challenge
[Einführung in Python3 Tag 1] Programmierung und Python
[Einführung in Python3 Tag 14] Kapitel 7 Zeichenfolgen (7.1.1.1 bis 7.1.1.4)
[Einführung in Python3 Tag 15] Kapitel 7 Zeichenfolgen (7.1.2-7.1.2.2)
[Einführung in Python3 Tag 21] Kapitel 10 System (10.1 bis 10.5)