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

8902 次点击
所在节点    Python
107 条回复
qwertyzzz
2018-12-10 22:28:29 +08:00
虽然我不会 python 但是我喜欢看第一种
dd0754
2018-12-10 22:33:55 +08:00
分情况,这种用第一种
arthasgxy
2018-12-10 22:38:04 +08:00
“但有同事说不够 pythonic ”
等他被我这种暴徒打成 pythonfuck 之后,他就知道错了
SimbaPeng
2018-12-10 22:42:23 +08:00
觉得第一种清晰的人只不过是先入为主,自己熟悉的东西觉得清晰,不熟悉的东西觉得绕
monkeylyf
2018-12-10 22:42:25 +08:00
同意二楼。
因为这里 has_data 被两次使用来用 condition check,毫无疑问第一种好。
如果 has_data 只被用一次做 condition check, 两种感觉都可以。
readability > pythonic for the sake of being pythonic
southsala
2018-12-10 22:42:34 +08:00
要降低复杂度,不要炫技
DongDongXie
2018-12-10 22:45:52 +08:00
这里第一种就可以了,只需要判断一次
daweii
2018-12-10 22:46:27 +08:00
第一种 可读性强
blless
2018-12-10 22:50:34 +08:00
第一种
xiangyuecn
2018-12-10 22:53:57 +08:00
第二种会被打,前几天我给微软 github 提交了个 pull,被他们的人喷了个体无完肤,原因就是跟第二种类似

一堆这种说格式的
freestyle
2018-12-10 22:53:59 +08:00
无论是从性能还是可读性还是维护性方面考虑都是第一种
niubee1
2018-12-10 22:54:31 +08:00
或者第三种写法

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


或者 第四种写法

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:
return "rollback", sql_data.get("task_id", "")
else:
return "calculate", sin_id

你那种多两个中间变量出来的写法啰嗦冗长可读性差, 根据剃刀原则, 如无必要勿增实体, 那两个中间变量纯属多余, 所以不是写的方法问题, 是你本身的逻辑能力问题. 是 if else 多行好还是单行好, 其实排一下版, 都挺好的.
2exploring
2018-12-10 22:55:38 +08:00
没写过 Python 的来说一句,表示能看懂,这和 C/C++中的三元操作符 ? : 不是一个理吗?我同意 2 楼和 7 楼,如果只是涉及到一个变量,那我会使用第二种。
kevin1852
2018-12-10 22:55:40 +08:00
```
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 = "calculate"
task_id = sin_id
if has_data:
calculate_func = "rollback"
task_id = sql_data.get("task_id", "")
return task_id, calculate_func
```
不是要这么写吗?
xpresslink
2018-12-10 23:01:51 +08:00
楼主提的这个问题根本就没有意义,这个毫无疑问要用第一种格式,注意只是格式。两种写法的逻辑和哲学本质上是一样的,只是第二种根本就不推荐在函数和业务代码中使用,只有在配置文件中条件参数的情况使用一下。

python 是动态语言,倾向于直接 try 可能存在异常的资源,使用异常处理捕捉。
另一种是先检测可用再使用,C 之类的静态语言倾向于这个哲学。
zzzhbooo
2018-12-10 23:07:45 +08:00
自己写代码随便怎么写,写出花来都没人管,团队合作除非能提高运行效率,不然就老老实实写大部分人能看懂的代码
agdhole
2018-12-10 23:09:36 +08:00
第二种是伪三元的实现?
在最好的语言里面只需要

calculate_func
= has_data
? "rollback"
: "calculate";

(😀
ithou
2018-12-10 23:10:49 +08:00
看第二种要疯
ericls
2018-12-10 23:13:06 +08:00
第二种 因为第一种你需要保证 所有在 if 里面添加的名字 在 else 里面也要有 这就多了一个出错的机会
rayhy
2018-12-10 23:20:52 +08:00
赞同 @niubee1 的方法,总觉得没必要再用两个变量了,早点 return 吧?

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

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

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

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

© 2021 V2EX