《Python源码剖析》笔记int_repr()

在原书中,作者使用vs2003运行python2.5的项目,而现在配置这样的环境比较复杂,所以我尽量在配置环境上时间相差小一点,刚配置好,编译成功源文件,希望按照书上说的。修改int_repr()函数,结果变化有点大,弄了很久最后失败了,但把过程记录下来,以供以后考证。
运行环境:
window10
vs2010
python2.7.13,编译的是PC目录里面的VS9.0的项目

先看看原书的写法:
在这里插入图片描述
作者在源代码中修改了int_repr()这个函数,但是我在python2.7.13版中,没有找到这个函数,作者也没有说在哪一个文件里面,我就想会不会是自己写的一个函数,之后我便在intobject.c这个文件里面写了这个函数,但是运行以后,输入-999发现没有用,转念一想,我只是定义了这个函数,根本就没调用它,怎么可能有用。所以,我放弃自己写这个函数的想法,猜测可能这个函数被这个版本删掉了(可能可以查到版本更新记录),于是我换了一个想法,我在已有的函数里面加入这段代码是不是可以呢?于是挑选了floatobject.c文件中的相对简单的float_repr()函数,下面是这个函数原来的样子:

static PyObject *
float_repr(PyFloatObject *v)
{
    return float_str_or_repr(v, 0, 'r');
}

经过修改,变成了这样:

static PyObject *
float_repr(PyFloatObject *v)
{
	PyObject *str;
	PyObject *out;
	str = PyString_FromString("I am in float_repr");
	out = PySys_GetObject("stdout");
	PyObject_Print(str, stdout, 0);
	printf("\n");
	
    return float_str_or_repr(v, 0, 'r');
}

我之前是加了原文中的条件,现在为了更方便的测试,就不加条件了,然后再在控制台输出,发现依然没成功,后来看了书发现,作者用来IDLE运行代码,难道是因为控制台是标准输出的原因?于是我在网上找如何使用IDLE,最后发现它的运行文件在Lib文件夹的idlelib里面,要运行idle.bat。第一次运行直接报错:
在这里插入图片描述
原来是路径不对,但是我找不到自己的pythonw.exe文件,因为之前书上说,只需要编译python和pythoncore工程即可,导致没生成pythonw.exe文件,所以我重新编译了所以python工程,生成了pythonw_d.exe文件,并且为了方便,直接改了bat文件的寻找的地址,最后运行,pythonw_d.exe文件倒是找到了,但是没运行成功,弄了好久都不行,最后放弃IDLE了(如果有大佬知道为什么,请告诉我,谢谢了!)然后我直接用Pycharm当作IDLE来使用,创建一个新的工程,然后把Python解释器手动导入Pycharm,最后再执行代码,发现依然没有我想要的输出。结果,用了Pycharm,我再用VS编译就报错了。(下次记得备份)。
之后,我实在不知道float_repr()会在什么情况下被调用,于是我把代码写到了floatobject.c的float_print()里面:

/* ARGSUSED */
static int
float_print(PyFloatObject *v, FILE *fp, int flags)
{
    char *buf;
	PyObject *str;
	PyObject *out;
	
	if(PyFloat_AsDouble((PyObject *)v) == 1.1){
		str = PyString_FromString("I am in float_repr");
		out = PySys_GetObject("stdout");
		if (out != NULL){
			PyObject_Print(str, stdout, 0);
			printf("\n");
		}
	}

    if (flags & Py_PRINT_RAW)
        buf = PyOS_double_to_string(v->ob_fval,
                                    'g', PyFloat_STR_PRECISION,
                                    Py_DTSF_ADD_DOT_0, NULL);
    else
        buf = PyOS_double_to_string(v->ob_fval,
                            'r', 0, Py_DTSF_ADD_DOT_0, NULL);
    Py_BEGIN_ALLOW_THREADS
    fputs(buf, fp);
    Py_END_ALLOW_THREADS
    PyMem_Free(buf);
    return 0;
}

想看看代码逻辑,最后运行在命令行和运行在Pycharm的输出是一模一样的,我也不知道问题出在哪,还是本来就是这样,希望有大佬帮忙解释解释。

本人是C语言小白,没怎么接触过C语言,现在在研究Python源码,如果有什么错误,欢迎各位大佬指正,感谢!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值