以下两种风格 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 条回复
Leigg
2018-12-11 12:20:35 +08:00
如果你们写的代码不用再维护了,怎么简洁怎么来。
xuboying
2018-12-11 12:20:51 +08:00
@liyoubin37 #22 : @SaltyFishMo #34 说的对,你的例子有两大缺点,见 http://book.pythontips.com/en/latest/ternary_operators.html
aliao0019
2018-12-11 12:24:41 +08:00
这两个选第一种是因为要用来判断的是一个条件而不是两个。
但如果把下面那种改成

```return (xx, xx ) if statement else (xxx, xxx ) ```

那我就会选它
laike9m
2018-12-11 12:34:32 +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)

if has_data:
return sql_data.get("task_id", ""), "rollback"
else:
return sin_id, "calculate"
```
laike9m
2018-12-11 12:38:38 +08:00
swulling
2018-12-11 13:00:23 +08:00
你同事是不是对 Pythonic 有什么误解? Pythonic 不是去用 Python 特有的语法,让他去读 Zen of Python 吧


Readability counts
24bit
2018-12-11 13:06:01 +08:00
第一种
j2gg0s
2018-12-11 13:40:34 +08:00
@vexplain 为什么会和 if else 连用两边有关系?
最初问题的纠结点不是在于要不要用 A if B or C 这样的表达方式吗?
随后找的例子哪里不合适?

反对这个
```
calculate_func, task_id = ("rollback", sql_data.get("task_id", "")) if has_data else ("calculate", sin_id)
```
反对的是强行把两行代码写成一行
iAcn
2018-12-11 13:46:21 +08:00
个人比较喜欢第一种,逻辑清晰
16ByUe06GJ2y3umH
2018-12-11 13:54:26 +08:00
@j2gg0s #88 哈哈,你这么说就没啥毛病了。
咱们出发角度不一样, 我认为问题的纠结点不是 A if B or C 这样的表达方式, 而是一些简单的单次判断用 A if B or C, 多次的判断同一值就要不要强行写成这种单行形式。

所以咱们最终会的观点是一致的。over。
Janusio
2018-12-11 13:59:02 +08:00
无 bug 第一,清晰简洁可读性第二,复杂深奥往后。0.0
stzz
2018-12-11 13:59:39 +08:00
@xiangyuecn #10 兄弟,好奇去 github 看了眼,被打的太惨了啊
windvans
2018-12-11 14:08:20 +08:00
我选第一,可读性可维护行还是要强一点
loryyang
2018-12-11 14:25:01 +08:00
我喜欢 1,而且我觉得 2 这个 if 语法糖就不应该出现
xiangyuecn
2018-12-11 14:27:02 +08:00
@stzz 嘿嘿 还是自己家的代码好 花样写都可以
SimbaPeng
2018-12-11 15:31:22 +08:00
@loryyang 三元运算符都成语法糖了
Bardon
2018-12-11 16:17:52 +08:00
一切的炫技都要被打倒,如果是多人参与的项目。
cnt2ex
2018-12-11 20:21:06 +08:00
@j2gg0s
我个人倾向于第一次给变量“赋值”看作声明,但是由于 python 中的特殊规则(不需要指明类型)并且没有类似 let 这样的关键字,所以“赋值”和“声明”使用了相同的语法,结果导致了没有声明只有赋值。不过这只是我个人的观点。

我说的按照作用域规则也是根据其他语言的习惯,因为我觉得块作用域是个好东西,所以在 python 里也遵从这样的规则(即使 python 本身并没有 if 作用域)。

以下是题外话,第二种写法,我觉得应该是函数式写法。因为函数式编程语言里通常不希望(甚至不允许)使用有副作用的语句,所以即使由于作用域规则写成:
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
这种先设置一个值,然后再根据条件修改一个值这样的写法是在函数式语言里不被提倡的。但是这种在实际应用中却十分常见,所以很多函数式的语言都会让 if 变成一个可以返回值的表达式。python 这种风格应该也是从函数式里借鉴过来的。
j2gg0s
2018-12-11 22:24:10 +08:00
@cnt2ex FP 实在是走的有点远,X if C else Y 其实只是起个三元表达式的作用,Python 的表现形式比较特殊,动态语言、若类型又让他的表达能力非常强,所以在 Python 里面用的比较多。
但真只是个三元表达式,还非要被一堆人说很难理解。
https://www.python.org/dev/peps/pep-0308/#adding-a-conditional-expression
kkk33
2018-12-12 01:32:47 +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