以下两种风格 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 语句的判断,请问大家是怎么选择代码风格的:)

10170 次点击
所在节点    Python
107 条回复
karllynn
2018-12-11 10:10:30 +08:00
这里显然应该直接 return

两者相比第一种好一点,因为只用判断一次
crawl3r
2018-12-11 10:16:08 +08:00
我会写成这样
```
return (sql_data.get("task_id", ""), "rollback") if has_data else \
(sin_id, "calculate")
```
lozzow
2018-12-11 10:21:59 +08:00
第一种适合写公司项目吧,毕竟看的人多,第二种其实写多了,看起来要比第一种舒服一些
rocketman13
2018-12-11 10:22:13 +08:00
分情况,你这种情况我觉得第一种更好,虽然我也经常被同事喷为什么不写一行解决。。。。
Felldeadbird
2018-12-11 10:23:52 +08:00
这个需要看复杂度,
如果纯粹是 if ( 1 = 1) 这种非常短的,不用过多猜想,用第一和第二都可以。
但是在复杂的业务环境下,第一种会对于维护 和 阅读有很好的帮助。
yiplee
2018-12-11 10:30:44 +08:00
简单点好 第一种
lihongjie0209
2018-12-11 10:33:42 +08:00
我倾向于不用 Python
houshuu
2018-12-11 10:38:04 +08:00
我选择第一种, 以后维护方便.
wlsnx
2018-12-11 10:39:12 +08:00
has_data 出现两次,这两种写法里很明显第一种更好。
如果一定要用第二种写法,可以参考 54 楼和 59 楼的写法,注意不要遗漏括号。
Vegetable
2018-12-11 10:46:02 +08:00
同一个变量两次作为 if 的条件,怎么可能用第二种,为了 pythonic 牺牲可读性就忍了,难道还要牺牲性能吗?
很多时候 if 的条件不是存在内存里的,而是 computed 属性,比如 @property,习惯了这种写法岂不是找骂...

千万不要让 pythonic 和 zhuangbility 划等号.
est
2018-12-11 10:52:55 +08:00
第一种更有可扩展性。
lauix
2018-12-11 10:53:10 +08:00
以前用第一种,现在看实际情况会采用第二种(三元表达式)
hjq98765
2018-12-11 10:55:26 +08:00
@liyoubin37 就是用 has_data 做索引呗?
tiedan
2018-12-11 10:57:20 +08:00
感觉都不是太好,应该减少那两个临时变量的出现。原来实习的时候曾经写了类似滥用临时变量的代码,被痛批
wingspread
2018-12-11 11:29:21 +08:00
第一种写法,可读性强,逻辑清晰
eamon666
2018-12-11 11:36:58 +08:00
第一种
Linxing
2018-12-11 11:44:52 +08:00
看情况把 比如获取一些参数 做一些简单的判断 param = 'something' if param is None else param 不然判断一大堆
imn1
2018-12-11 11:53:06 +08:00
第二种只是三元式变形而已,而且我不喜欢多次判断同一个条件

多次判断同一个条件不一定获得相同状态的,只不过此处没问题而已
如果预想(期望)所有判断都是返回相同状态的话,逻辑上不应这样写
richzhu
2018-12-11 11:59:05 +08:00
@arthasgxy 笑死我啦😂
SaltyFishMo
2018-12-11 12:17:55 +08:00

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

https://ex.noerr.eu.org/t/516296

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

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

© 2021 V2EX