在CPython源代码中定义math_sin函数?

时间:2019-04-18 12:03:01

标签: python cpython python-internals

我正在研究CPython的代码库。

我想知道在哪里可以找到math_sin的{​​{1}}表中出现的mathmethods函数的定义:

mathmodule.c

在主{"sin", math_sin, METH_O, math_sin_doc} 文件夹中进行grep "math_sin" -wr只会返回:

cpython

在哪里可以找到此函数的定义?

1 个答案:

答案 0 :(得分:9)

WHERE tblMovies.title = ? 是通过FUNC1 macro定义的:

math_sin

其中FUNC1 is defined as

FUNC1(sin, sin, 0,
      "sin($module, x, /)\n--\n\n"
      "Return the sine of x (measured in radians).")

因此预处理器将其扩展为:

#define FUNC1(funcname, func, can_overflow, docstring)                  \
    static PyObject * math_##funcname(PyObject *self, PyObject *args) { \
        return math_1(args, func, can_overflow);                            \
    }\
    PyDoc_STRVAR(math_##funcname##_doc, docstring);

(但随后全部都一行,并且 static PyObject * math_sin(PyObject *self, PyObject *args) { return math_1(args, sin, 0); } PyDoc_STRVAR(math_sin_doc, "sin($module, x, /)\n--\n\n" "Return the sine of x (measured in radians)."); 宏也已展开)

因此PyDoc_STRVAR基本上是对math_sin(module, args)的调用,而math_1(args, sin, 0)则调用math_1_to_whatever(args, sin, PyFloat_FromDouble, 0),它负责验证是否传入了Python浮点数,并将其转换为C double,调用math_1(args, sin, 0),根据需要引发异常,或使用sin(arg_as_double)传递的sin()函数包装PyFloat_FromDouble的double返回值,然后再将结果返回给调用方。< / p>

math_1()the double sin(double x) function defined in POSIX math.h

原则上,您可以预处理整个Python源代码树并将输出转储到新目录中;以下假设您已经成功构建了sin()二进制文件,因为它已用于提取python的必要包含标志:

gcc

,然后find . -type d -exec mkdir -p /tmp/processed/{} \; (export FLAGS=$(./python.exe -m sysconfig | grep PY_CORE_CFLAGS | cut -d\" -f2) && \ find . -type f \( -name '*.c' -o -name '*.h' \) -exec gcc -E $FLAGS {} -o /tmp/processed/{} \;) 将显示在math_sin中。

或者您可以告诉编译器使用/tmp/preprocessed/Modules/mathmodule.c标志将预处理器输出保存到.i文件中:

-save-temps

,您将在make clean && make CC="gcc -save-temps" 中找到make_sin