Python中如何理解和交接离职同事的代码?

今天准备离职的同事交接工作,有一段代码,大家看看。
django 写的接口,POST 请求,一共四个参数,下面用 a,b,c,d 代替

a = request.post.get(“a”)
b = request.post.get(“b”)
c = request.post.get(“c”)
d = request.post.get(“d”)

try:
a + b + c + d + "abcd"
except:
# 这里是错误的处理。

后来询问该同事,他说这是做类型检测,不是字符串就会报错。
我:!!! 哦~
Python中如何理解和交接离职同事的代码?


76 回复

好精巧的代码


接手别人的代码确实头疼,尤其是前任已经离职的情况。核心就三点:先跑起来,再理逻辑,最后看设计。

第一步:让代码先跑 别急着看细节,先确保你能在本地环境成功运行项目。重点看这几个文件:

  1. requirements.txtPipfile:用 pip install -r requirements.txt 装好所有依赖。
  2. README.md:看有没有启动说明。
  3. 入口文件(如 main.py, app.pymanage.py):找到程序起点。
  4. 配置文件(如 .env, config.py):检查数据库连接等关键设置。

如果跑不起来,优先解决环境问题。这是理解一切的基础。

第二步:理清核心逻辑 代码能跑之后,用“自顶向下”的方式看:

  1. 从入口开始:顺着函数调用链,用IDE的“转到定义”功能跟踪主线流程。
  2. 画个草图:在纸上或白板上画出主要模块、函数和它们的关系。别追求完美,自己能看懂就行。
  3. 重点看数据流:数据从哪儿进来(API请求、文件读取),经过哪些关键函数处理,最后到哪儿去(存数据库、返回响应)。这是理解业务逻辑的关键。

第三步:看整体设计 逻辑理得差不多了,再跳出来看结构:

  1. 目录结构:项目是怎么组织的?是MVC、模块化还是别的什么结构?
  2. 关键依赖:用了哪些主要的第三方库(比如Web框架用Flask/Django,数据处理用pandas)?这能快速判断项目类型。
  3. 找“坏味道”:留意大段重复代码(该抽函数)、超长的函数或类(该拆分)、到处散落的“魔法数字”(该定义成常量)。这些是你后续可能要优化的地方。

几个实用技巧

  • 用好IDE:像PyCharm或VSCode的查找引用、全局搜索、调试器是神器。
  • 写测试:如果项目有测试(tests/目录),运行它们。如果没有,在你理解某个函数后,试着给它写个小测试,能帮你确认理解是否正确。
  • 善用打印和日志:在关键位置加几句 print() 或查看现有日志,运行时观察数据变化。
  • 别怕问:如果公司还有了解情况的人(比如产品经理、测试同事),问问他们这个项目主要是做什么的,有什么已知的“坑”。

总结一下就是:先确保运行,再理主线流程,最后分析结构,过程中善用工具辅助理解。 这个过程急不来,耐心点,一块块啃下来就清晰了。

request.POST 拿到的值不都是字符串么😂

…不得不说一句,机智!

哈哈哈,你泄漏公司极密啦

isinstance : 你特么都这样了也不会想到我?

气死你

大意了吧,get 方法有默认值,返回个 None 就尴尬了

有些框架会自动进行数组的转化,PHP 里是这样的,python 强类型不太熟悉,不得而知

我天,我怎么没想到还能这么检测!!!

为了动态类型操碎了心😂




我是不是可以在他临走前怂恿他删个库 😂

奈何老哥是人才。

哈,老哥细心。

到底是谁走漏了风声,加薪。

emmm,曰:太长了,记不住。

锅从天上来,挡不住。

老哥是撸 PHP 的吗

每个人都会的,后来的人说前面的人,渐渐的发现自己也变成前人了^_^

可是这老哥有 4 年+经验了

一时除了专门写个函数还真想不出其他办法来简便的做到同样的事情…

取笑新手可不是个好习惯

4 年+工作经验的老哥了 😂

好吧… 陈年佳酿般的屎山, 都这么过来的, 没有 code review

略略略~

这不是经验问题了,这是意识问题

类型检测不是应该 jsonschema 之类吗

cr 的重要性可见一斑。然而,绝大多数人由于工作太多,疏于提交 cr/帮别人 cr。

serializer 做错了什么,为什么放弃 serializer

看具体需求可以 .get(“a”, “”) 然后 if a and b and c and d 或者说 all((a,b,c,d))
当然,其实 dataclass + dacite 能够解决大多数这种问题了。

我自己写代码也经常有很幼稚的 bug,我总感觉谁都有脑子短路的时候,所以看到别人代码有错都是提醒,心理上不敢去嘲笑。
是不是证明我还不太专业?专业人士不该出现幼稚的错误吧?

这样写很机智啊,一起检查所有变量的类型。感觉离职的这位水平应该不错

快,修改下,再来吐槽

这还机智,网上那么多解决方法,为啥不抄一个好的呢

marshmallow 就是应对这种情况

学习了,真精巧

如果很多参数的话这么做确实不错。。

有一说一,好歹是能用的(

为什么不用 isinstance 我是主攻 PHP 的

我觉得这样做没什么问题。Python 的 try…except 不仅是用来处理错误的。参见 fluent python P449.

In Python, try/except is commonly used for control flow, and not just for error han‐
dling. There’s even an acronym/slogan for that documented in the official Python glos‐
sary:
EAFP
Easier to ask for forgiveness than permission. This common Python coding style
assumes the existence of valid keys or attributes and catches exceptions if the as‐
sumption proves false. This clean and fast style is characterized by the presence of
many try and except statements. The technique contrasts with the LBYL style com‐
mon to many other languages such as C.

参考 https://docs.djangoproject.com/en/2.2/ref/request-response/#django.http.QueryDict.get

如果没有传过来对应的参数,是会有 None 的,人家一行代码就检查了 4 个参数是否都有传值,挺厉害的技巧啊。

精巧,思路瞬间开阔了

就不能这么写吗?
try:
a = request.post.getAsString(“a”)
b = request.post.getAsString(“b”)
c = request.post.getAsString(“c”)
d = request.post.getAsString(“d”)

catch:
// 异常逻辑

自己扩展一下或者是写一个工具类都可以啊。


没看懂这种表意不明的写法有什么好推荐的

哈哈哈哈哈哈😂曰:“有什么问题吗?又不是不能用” (:dog

学到一招,不得不说这哥们 6p 啊

我真没觉得这代码有问题……

这样写比较取巧,对性能又没啥影响

可以用 serializer 啊。直接类型检查和 format 各种处理,

这么做是最简单的,当然也可以选择写个检测的

这段代码 再加个注释 就完美了 ^_^

a, b, c, d = map(request.post.get, [“a”, “b”, “c”, “d”])
assert all(isinstance(x, str) for x in [a, b, c, d]), "not str"

其实感觉用 isinstance 可读性没有 a+b+c+d 好。。

降低可读性,稳固职场地位。

先不说你同事用取巧的方式写代码,你连这段代码都看不懂,你不觉得你自己问题更大吗?还发出来取笑别人,无语了。

精辟。巧妙,学习了。

发出来大家讨论,怎么就成了取笑别人呢?

可以啊,但是不判空么

少了一段注释,这哥们是个小机灵鬼!

请教一下,话说这样写要怎么判断 abcd 中哪个不是字符串需要重新获取或异常处理呢……在 except 里面再一个个去排查吗?

挺有意思的,不错

之前在别人 js 代码里面见过
function sbtString(s1, s2) {
var ous = “”;
s1 += “”;
s2 += “”;
for (var i = 1; i <= s1.length; i++) {
var c1 = s1.substring(i - 1, i);
var c2 = s2.indexOf(c1);
if (c2 == -1) {
ous += c1;
}
}
return ous;
}

如果 abcd 里面有变量不是字符串,用+号拼接会报错,因为+号只能拼接字符串类型的变量,有别的类型的变量拼接出来会报错,python 是动态强类型语言。

额。。看错你的问题了不好意思

如果是希望 a, b, c, d 都存在值,post 的时候这四个都要有,那下面这个做法不好吗?

try:
(游标卡尺占位)a = request.post[“a”]
(游标卡尺占位)b = request.post[“b”]
(游标卡尺占位)c = request.post[“c”]
(游标卡尺占位)d = request.post[“d”]
except:
(游标卡尺占位)# …

写个 a+b+c+d+"" 不是很奇怪吗?

看这个写法大胆猜测一下大概是不需要判断到底 abcd 哪个是空的,直接返回请求错误就行了。

我也这样写过…

#40 你确定你用过 django?

也可能是 None

是的,很好用

#66 自己扩展一下或者是写一个工具类都可以啊。

这种常见的框架扩展一下内置的方法应该不难吧

你不是应该高兴么,毕竟他要离职了

其实还好,不想改的话加句注释。他可能是不太清楚 HTTP 要求所有数据都以字符串发送,所以解出来也都是字符串,就算是真用 request.post(url, data={‘a’: True})传过去也是’True’,所以不用担心会是其他类型,只可能是有这个参数或者没这个参数。所以不想改的话就打个注释留着,改的话就改成
try:
a = request.POST[‘a’]

就行了

楼主头像是为了契合这代码换的?

之前 python 里面用过这种方法,比较取巧但是难登大雅之堂。你的同事 python 至少有一年经验

未来的美团外卖人员!

回到顶部