使用C/C++扩展Python之二

在 Thu 26 November 2015 发布于 Python 分类 • 标签为 Python, C/C++, Python扩展

Python 引用计数 在上一篇文章中,简单的介绍了使用C/C++开发Python模块的一般步骤。还借用上一篇文中的代码:

static PyObject* py_reverse(PyObject* self, PyObject* args)
{
    char* result;
    char* target = NULL;
    PyObject* retval = NULL;

    int ret = PyArg_parseTuple(args, "s", &target);
    if (!ret) {
        return NULL;
    }   

    result = reverse(target);
    retval = (PyObject*)Py_BuildValue("s", result);
    return retval;
}

上篇文章说道,这只是一个很简陋的封装,还缺少错误处理和引用计数处理的逻辑。 Python …


阅读全文

使用C/C++扩展Python之一

在 Thu 12 November 2015 发布于 Python 分类 • 标签为 Python, C/C++, Python扩展

假设我们需要使用C/C++实现一个翻转字符串的扩展功能, 下面是C语言的实现

#include <stdio.h>
#include <stdlib.h>

char* reverse(char *s)
{
    if (NULL == s) {
        return NULL;
    }
    int low = 0;
    int higth = strlen(s) - 1;
    while (low < hight) {
        char tmp = s[low];
        s[low] = s[hight]
        s[hight] = tmp;
        ++low;
        --hight;
    }
    return s;
}

首先,我们需要解决的问题是,怎样在Python环境下传递参数,即在Python …


阅读全文

scrapy排重机制

在 Wed 16 September 2015 发布于 源码分析 分类 • 标签为 scrapy, Python, 爬虫

本篇文章主要的内容是scrapy在单机排重下的机制, 并提共分布式scrapy爬虫服务的url排重方案

scrapy在单机下设置url是否排重过滤很简单, 在每次抛出对该url构造的Request对象给调度器(schedler)时候, 设置Request的参数dont_filter 是否为True来让schedler判断时候对其走排重过滤的逻辑, dont_filter的默认值为False, 即该url会走排重逻辑 源码逻辑如下:

    def enqueue_request(self, request):
        if not request.dont_filter and self.df.request_seen(request):
            self.df.log(request, self.spider)
            return False
        dqok = self._dqpush(request)
        if dqok:
            self.stats.inc_value('scheduler/enqueued/disk', spider=self.spider)
        else …

阅读全文

从Python的闭包到装饰器

在 Sun 05 July 2015 发布于 Python 分类 • 标签为 Python, 闭包, 装饰器

函数里面定义函数叫做嵌套函数, 如:

def Print(msg):
  def doPrint():
    print msg
  doPrint()

print dir(Print)
#['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']
print Print.__closure__
# None
Print('Hello …

阅读全文

[译]了解Python的with语句

在 Sun 08 March 2015 发布于 Python 分类 • 标签为 Python

这篇文章虽然有些时日, 但是觉得这篇博文通俗易懂, 翻译起来也没有太大的压力, 然后就有了篇译文. 初次翻译, 如有错误, 请告知, 谢谢!

从comp.lang.python和其他论坛来看, 有经验的python开发者对python2.5新的with语句(坏链接)似乎依旧有些困惑.

就像python中的其他大部分的特性, 只要你弄懂了with 语句想要解决的问题, 你就会知道with语句其实是很简单的. 看看下面这段代码:

set things up
try:
    do something
finally:
    tear things down

‘初始设置’ 可能是打开一个文件, 或者是获取一些额外的资源, ‘清理阶段’可能是关闭一个文件, 释放或者归还资源. try-finally结构保证 '清理阶段'部分是一定被执行,尽管 主要逻辑部分的代码并没有把要做的工作做完

当有大量这种重复性的工作时, 把'初始设置' 和 '清理阶段'封装成库是很便利, 也易于复用. 你可能会做如下封装:

def controlled_execution …

阅读全文