以下两种风格 Python 写法,请问大家倾向哪种:)

2018-12-10 22:19:28 +08:00
 lucat

看到不同的同事代码,表达同一个意思,主要 if 部分以下哪种写法比较好些:)

第一种写法

def xxxx(ph, sin_id):
    """
    
    """
    
    with OracleConnect(xxxx) as db_oracle:
    	
        sql = u"xxxxx"
        has_data, sql_data = db_oracle.get_one(sql)
        
        # 第一种写法
        if has_data:
            calculate_func = "rollback"
            task_id = sql_data.get("task_id", "")
        else:
            calculate_func = "calculate"
            task_id = sin_id
            
	return task_id, calculate_func

第二种写法

def xxxx(ph, sin_id):
    """
    
    """
    
    with OracleConnect(xxxx) as db_oracle:
    	
        sql = u"xxxxx"
        has_data, sql_data = db_oracle.get_one(sql)
        
        # 第二种写法
        calculate_func = "rollback" if has_data else "calculate"
        task_id = sql_data.get("task_id", "") if has_data else sin_id   
        
   	return task_id, calculate_func

第一种写法,比较直接,清晰明了,但有同事说不够 pythonic

第二种写法比较 pythonic,但是类似写法,对于刚接手别人代码的同事,就要稍微绕一下才能读懂。

由此拓展,想到在写业务逻辑中,经常会有 if 语句的判断,请问大家是怎么选择代码风格的:)

8982 次点击
所在节点    Python
107 条回复
congeec
2018-12-11 07:38:03 +08:00
@VDimos 嗯啊,rust 基于表达式用三元操作符+表达式可以少命名一个变量,对于习惯函数式的人也直观。
我觉得函数式的语言都推荐一行的写法
@menc has_data 的值不一定是字符串,也可能是 bool, int, list, etc
poplar50
2018-12-11 07:41:45 +08:00
这种就看条件写出来长不长了,就题中的情况,我会写第一种,方便阅读。
buy2top
2018-12-11 07:46:29 +08:00
调试时候第一种容易检查,第二种容易忘异常
FrailLove
2018-12-11 08:11:20 +08:00
写倒是无所谓 我觉得第一种修改起来更简单 支持 1
LokiSharp
2018-12-11 08:29:18 +08:00
第一种调试起来方便,第二种调试火葬场
httplife
2018-12-11 08:32:22 +08:00
我不懂 Python,
Python 不是崇尚 "There should be one-- and preferably only one --obvious way to do it."

根据:
http://google.github.io/styleguide/pyguide.html
第一种格式相对好.
woodensail
2018-12-11 08:53:43 +08:00
这还需要问吗?简单逻辑写三元,复杂逻辑写 if 是常识吧。
另外,可读性不是代码越长就越好的,片面拉长代码会导致阅读代码时联系上下逻辑困难。
woodensail
2018-12-11 09:00:05 +08:00
事实上 python 的理念也就是这样,让程序员把精力集中于业务逻辑上,而不是代码技巧上。
举例而言,python 的 with 语句可以让开发者不用操心资源的关闭,python 的 defaultdict 可以让用户不用每次取完 dict 后先判一遍非空。
理想情况下的 python 应该像自然语言一样,可以通读,一行描述一条逻辑,而不是花很多行实现一个编程技巧,以完成一个特定逻辑。
zhang2e
2018-12-11 09:27:45 +08:00
有一本书,叫做《编写可读代码的艺术》,里面讲到了关于「滥用三元运算符」这个问题。
pp3182429
2018-12-11 09:28:30 +08:00
@woodensail 支持,如果 if 判断只处理一个变量就用三元表达式更方便也不影响阅读,超过就用代码块更清晰。
Woodywuuu
2018-12-11 09:28:41 +08:00
有段时间喜欢 py 只写一行,行数越少越好,各种推导式兰比达堆在一起,代码行数贼少,感觉自己很简洁了
然后第二天想改个点就看不懂自己写的是啥了
BOYPT
2018-12-11 09:30:52 +08:00
has_data 变量控制了下面代码块的总体逻辑。第二种写法虽然局部上是 pythonic 的,但是不利于代码的阅读和理解。

如果只有一行代码受 has_data 的影响,这点还有点争议性哪个好,但是只要超过一行(形成代码块),就显然应该选择第一种。
Heyavc
2018-12-11 09:33:04 +08:00
如果项目里有其他人阅读或修改的话,还是选择第一种更好。
faimin
2018-12-11 09:39:59 +08:00
我选择第一种,毕竟开发不是用来炫技的,可读性是很重要的
vexplain
2018-12-11 09:46:14 +08:00
@j2gg0s #27 恕我直言, 你搂的三个代码没有一个地方把 if ... else ... 连用两遍的。
vexplain
2018-12-11 09:49:04 +08:00
感觉你这同事怕是对 pythonic 有什么误解吧?
Simple is better than complex.
myyou
2018-12-11 09:56:09 +08:00
我喜欢第三种
calculate_func, task_id = ("rollback", sql_data.get("task_id", "") ) if has_data else ("calculate", sin_id)
zqguo
2018-12-11 09:59:03 +08:00
我喜欢第二种,简洁。
xia0pia0
2018-12-11 10:04:34 +08:00
第二种是在 python 里确实是很常见的写法。重要的是风格要统一,不要多种风格,看得头疼。
TrickWu
2018-12-11 10:08:32 +08:00
第二种,写多了一眼就看明白

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/516296

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX