Pulpcode

捕获,搅碎,拼接,吞咽

0%

前言

之前的工作任务,大多一直在做这样一件事,请求第三方接口,并将接口数据进行解析成固定格式后返回。之后在做业务处理,包括更新数据库状态之类的。

这里想展示一种解决方案,能够解决以下的问题,包括:

  1. 请求出现异常,包括链接超时,解析异常,请求错误的处理。
  2. 方便的进行单元测试。
  3. 方便的进行扩展。

注意第3条是指数据来源可能是不同的url,请求和相应格式都不同,但是要做的业务逻辑却是相同的,如何做到方便扩展,接入新的三方时,不用该业务代码。

还有第2点,特别提到了单元测试,这里我是指模拟测试,因为在真实情况下,这些类似于创建订单的接口,不是你想调用就调用的,甚至是有些接口,比如银行的服务,在调用的时候都是有成本的,这个时候使用模拟类来完成单元测试就非常有必要了。在这个例子中我们使用的python的mock对象。

下面我会写一个假的例子,来讲解我的解决方案,实际上我们大多数调用的三方接口,并不是走查询这么简单,其实更多是一些post接口,包括下单,和通知。就算是查询接口,可能也不会走get,而是走的post协议。

阅读全文 »

前言

之前一直总结了很长时间的设计模式,只不过一直都是写在笔记上,并没有整理成博客。之前在学校跟一个老师聊起来的时候,他还说过,有很多东西,他只会写在本子上,从来不会公开的,我见过一些开发了十几年的java大牛,他们也不会轻易的把自己值钱的经验随便告诉给别人,跟他们一起工作,都要相近一切办法才能把值钱的东西挖过来。实际上就是这样,分享归分享,有些东西是会垄断的,你们所谓的google,facebook开源,实际上都是他们觉得不值钱的东西,值钱的东西当然不能开源,毕竟研究起来太费劲,耗费大量人力物力。还有很多人问我问题的时候会说,自己懒得看了,直接告诉他算了。对于这种伸手党也是呵呵了。

那么为什么我要总结这样一篇博客呢?因为我觉得这真不是啥值钱的玩意儿,如果把这点东西还当宝贝,那这辈子眼界也就这么窄了,还有我觉得很少有人会看我的博客。

以上就当我扯淡了,这篇博客的题目叫python的web设计模式。为什么会叫一个这样的题目呢?
首先我觉得,要给自己在工作中所做的事,下一个定义,首先我是一个python工程师,并且我在做web开发,那么一些设计模式,对于我而言是没有用的(当然实际上我也是会的)。而另一些,是我要去加强的。

那么我们就来讲讲,作为一个python web开发者,我们可以忽略掉哪些设计模式,可以加强哪些设计模式? 那么在看这篇博客之前,你自然需要先了解设计模式啦,否则下面的内容你是看不懂的。

阅读全文 »

众所周知,python的tuple对象是不可变对象,创建之后就是不可变对象,无法修改。

1
2
3
4
s = (1, 2, 3)
s[2] = 5
# 会抛出以下错误
# TypeError: 'tuple' object does not support item assignment

那么如果是这样修改呢?

1
2
3
4
5
6
7
8
a = 1
b = 2
c = 3
s = (a, b, c)
a = "str"

print s
# s 的结果依旧是 (1, 2, 3)
阅读全文 »

前言

其实,我最不爱做笔试题了,实际上在这几年的面试经验来看,大部分求职者其实也不喜欢做笔试题,有的同事甚至跟我说,一让他做笔试题就想走了。而且一些公司也不安排什么笔试题,可能校招会有笔试题,社会招聘,都是现场给纸和笔,一边问一边写的。而且我也真不明白这些笔试题是否能选拔出来那些高智商的,可培养的员工?他们算法好的要命。反正我不这样认为,面试这东西,可能真的需要有经验的人,多聊,多沟通,到底做过什么样的项目,是否对技术本身有理解。

以上就当我扯淡了,我可能最近会写几篇解答笔试题的博客。

当然这个答案完全是我自己写的,如果有什么不对的地方,或者有更好的解法,还请指正。

题目

已知两个长度为N的数组A,B,已分别按升序排列
A. 求第N和N+1个数,伪代码实现,并估算复杂度。
B. 如果你的揭发时间复杂度为O(logN),请考虑复杂度更低的算法。

阅读全文 »

最近琐事一堆,没时间更新博客,忙完了这段时间在好好填坑吧。

这里写一篇关于python的两个坑。

函数默认参数

先说结论,我们的函数,如果传入的参数是一个容器,那么应该以这样的方式设置默认值:

1
2
3
4
def foo(li=None):
xxxx
xxxx
....

而不是这种方式:

1
2
3
4
def bar(li=[]):
xxxx
xxxx
....
阅读全文 »

之前同事遇到一个问题,最后被我解决了,现在在这里分析一下。

错误描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
d = {
"name": "爱德华蒂奇",
"age": 12 }

headers = {
'Content-Type':'application/json',
'content-encoding' :"utf-8"
}

body = json.dumps(d, sort_keys=True, separators=(',',':'), ensure_ascii=False)

data = body.decode('utf-8')

print body
print body[: len(data)]

resp = requests.post("http://localhost:8888/json", data=data, headers=headers)

我将一个unicode字符串通过requests的post方法发送数据,结果在服务器端打印数据时,数据部分丢失。

阅读全文 »

最近也是因为琐事一堆,所以一直都没有更新博客,慢慢会把欠的债都补回来。

这篇博客主要介绍一些如何使用python的 nose来写单元测试,算是介绍nose这个工具,而不是如何去写好一个单元测试。

不用unittest

我很少用unitest,因为1,没有nose好用。2是因为那个一点不像python的风格,能像java

setup和teardown

nose里面有多种可用的setup和teardown

Package级别的

写在init.py文件里包装

1
2
3
4
5
def setup_package():
pass

def teardown_package():
pass
阅读全文 »