python代码refine实例

原创 2013年12月03日 11:56:00

有段代码这么写的:

def http_request(request_url="", method="POST", data=""):
    headers = {};
    headers["Content-Type"] = "application/json;charset=utf-8";
    headers["Accept"] = "application/json";

    try:
        # TODO: never use system default block request, use eventlet instead.
        req = urllib2.Request(url=request_url, data=data, headers=headers);
        req.get_method = lambda: method;
        urllib2.socket.setdefaulttimeout(Constants.JOIN_TRANSCODER_TIMEOUT);
        response = urllib2.urlopen(req);
    except Exception, ex:
        # TODO: always this error code?
        code = Errors.join_transcoder_error;
        msg = "url=%s connection error, code=%#x, detail=%s"%(request_url, code, ex);
        Logger.error(tag, "http_request+error %s"%(msg));
        return (code, msg, Errors.parse_msg(code, msg));

    if not Constants.is_request_ok(response.code):
        code = Errors.join_transcoder_error;
        msg = "url=%s request error, code=%#x"%(request_url, code);
        Logger.error(tag, "http_request+error %s"%(msg));
        return (code, msg, Errors.parse_msg(code, msg));

    response_str = response.read();
    ret = json.loads(response_str);
    return (ret["code"], "url=%s request success"%(request_url), response_str);

做的事情很少,但是看起来超级复杂,原因在于这个函数提供了:

1. http请求的功能,包括GET/POST。

2. 错误处理:错误和具体的逻辑相关(join_transcoder_error)。

3. 混乱的错误逻辑:几个地方都判断错误,返回不同的码。

4. 混乱的返回值:试图提供直接返回给client的错误信息,应该返回定义良好的错误码。

5. 实际上这个函数只是返回了http的结果,外面还得去解析json。

会导致使用起来很奇怪:

    def join(self):
        (code, msg, response_str) = http_request(self.worker_url, "GET", data=None);
        self.error_code = code;
        if not Errors.is_success(code):
            self.reset(code);
            return code;

        ret = json.loads(response_str);
        if Constants.is_offline(ret["data"]["heartbeat_time"]):
            code = Errors.not_heartbeat_error;
            Logger.debug(self.__tag, "transcoder+join transcoder worker_id=%s, url=%s "
                "change status to offline. code=%#x"%(self.worker_id, self.worker_url, code));
            self.reset(code);
            return code;

        self.status = ret["data"]["status"];
        self.error_code = ret["code"];
        self.remain_cpu = ret["data"]["remain_cpu"];
        self.heartbeat_time = ret["data"]["heartbeat_time"];

        if ret["data"]["remain_cpu"] == 0:
            self.status = Constants.WORKER_STATUS_WORKING;

        return Errors.success;

拿到http_request之后还需要解析json,很罗嗦。


建议refine如下:

'''
perform a http get request, parse the response to json.
@param url: a str indicates the url to request.
@return tuple(code, desc, data) where:
    code: the error code, @see: Errors.
    desc: the error description str.
    data: parsed response object in json. None if error.
'''
def http_get(url):
    (code, desc, data) = (Errors.success, "success", None);

    try:
        res = eventlet.green.urllib2.urlopen(url=str(url)).read();
    except Exception, ex:
        code = Errors.network_http_get;
        desc = "http get error, url=%s, code=%#x, exception=%s"%(url, code, ex);
        Logger.error(tag, "http_request+error %s"%(desc));
        return (code, desc, data);

    try:
        data = json.loads(res);
    except Exception, ex:
        code = Errors.network_json_parse;
        desc = "parse json error, url=%s, code=%#x, res=%s, exception=%s"%(url, code, res, ex);
        Logger.error(tag, "http_request+error %s"%(desc));
        return (code, desc, data);

    return (code, desc, data);

这个函数分开了GET和POST,对结果解析为JSON。调用如下:

    def join(self):
        (code, desc, data) = bravo_utility.http_get(self.worker_url);
        self.error_code = code;
        if not Errors.is_success(code):
            self.reset(code);
            return code;

        self.status = data["data"]["status"];
        self.error_code = data["code"];
        self.remain_cpu = data["data"]["remain_cpu"];
        self.heartbeat_time = data["data"]["heartbeat_time"];

        if data["data"]["remain_cpu"] == 0:
            self.status = Constants.WORKER_STATUS_WORKING;

        return Errors.success;

当然,还有更好的做法,但这样改已经有所进步了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

AS3代码Refine实例

最近看公司flashp2p客户端,拾起了童年写as的梦。
  • winlinvip
  • winlinvip
  • 2014年09月04日 18:45
  • 1271

BASH代码Refine实例

有段代码是这么写的: #!/bin/bash function build_license_3_0(){ echo "build license_3.0 in ${work_dir}" ...
  • winlinvip
  • winlinvip
  • 2014年09月25日 16:59
  • 743

数据清洗工具OpenRefine

数据清洗工具OpenRefine作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs数据经常被称为一座金矿,尤其是在当今数据驱动的经济环境下更是如此。怎样把数据...
  • chszs
  • chszs
  • 2014年02月27日 13:39
  • 25079

80个Python经典资料(教程+源码+工具)汇总

大家好,51CTO下载中心根据资料的热度和好评度收集了80个Python资料,分享给Python开发的同学。内容包括1个Python专题、66个学习资料、7套Python源码和6个相关软件。附件较多,...
  • wishfly
  • wishfly
  • 2015年05月13日 16:15
  • 5371

实现的简单python例子

本人学python没多久,不足的望指点 1.输入三个变量,然后安小到大排序
  • oMuYeJingFeng1
  • oMuYeJingFeng1
  • 2014年04月16日 09:39
  • 39832

python开源项目及示例代码

1 算法 1.1 字符串处理 re 正则表达式的标准库。 StringIO / cStringIO 以读写文件的方式来操作字符串(有点类似于内存文件)。 cStri...
  • chengxuyuanyonghu
  • chengxuyuanyonghu
  • 2017年02月08日 09:46
  • 639

Python写一个简单的爬虫样例(不超过50行代码)

###写在题外的话 爬虫,我还是大三的时候,第一次听说,当时我的学姐给我找的一个勤工俭学的项目,要求是在微博上爬出感兴趣的信息,结果很遗憾,第一次邂逅只是擦肩而过。然后,时间来到4年后的研二,在做信息...
  • wsbxzz1
  • wsbxzz1
  • 2017年06月10日 10:55
  • 2914

RefineNet学习笔记

采用多层残差链式方式,融合低层和高分辨率图信息
  • u010067397
  • u010067397
  • 2017年12月20日 20:17
  • 60

TensorFlow个人学习(下载安装&简单代码例子)

(由于项目最终决定使用TensorFlow,所以博客来总结学习TensorFlow) 下载和安装: 由于TensorFlow也官方支持windows了,省去了很多功夫,安装就更简单了。 Te...
  • q17686617156
  • q17686617156
  • 2017年06月08日 19:18
  • 1671

决策树原理实例(python代码实现)

决策数(Decision Tree)在机器学习中也是比较常见的一种算法,属于监督学习中的一种。看字面意思应该也比较容易理解,相比其他算法比如支持向量机(SVM)或神经网络,似乎决策树感觉“亲切”许多。...
  • csqazwsxedc
  • csqazwsxedc
  • 2017年03月26日 23:04
  • 3756
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python代码refine实例
举报原因:
原因补充:

(最多只允许输入30个字)