Python 里你们会把 if 写成单行吗(`if cond:doit()`)? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Vegetable
V2EX    Python

Python 里你们会把 if 写成单行吗(`if cond:doit()`)?

  •  
  •   Vegetable 2019-03-18 17:51:34 +08:00 6696 次点击
    这是一个创建于 2403 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有时候判断一个条件,决定是不是执行一个方法. 今天看了一下自己写的代码里,出现了不少这种类似的判断,写的时候没多想,review 的时候比较纠结.觉得不好看

    if dirty: clean() 

    网上看到很多人喜欢写这样的代码,不幸的是,我使用 autopep8 会自动换行,写成这样也白扯

    if dirty:clean() 

    这样效果看起来也一样,但是这就是赋值语句拿来做流程控制好像不太合适,可读性也有一些损失.

    dirty and clean() clean() if dirty else None 

    写完这几行字我决定不改这一部分了

    26 条回复    2019-03-20 13:49:07 +08:00
    nfroot
        1
    nfroot  
       2019-03-18 19:17:35 +08:00 via Android
    写同一行看的时候不是很喜欢
    cxyfreedom
        2
    cxyfreedom  
       2019-03-18 19:21:54 +08:00 via iPhone
    这个我遵循 pylint 提示换行
    Leigg
        3
    Leigg  
       2019-03-18 19:31:53 +08:00 via iPhone
    省略这一行代码换来的是可读性的缺失,并不值当。
    Leigg
        4
    Leigg  
       2019-03-18 19:33:06 +08:00 via iPhone
    if else 的简洁我一般只在逻辑很简单时这样干
    youngce
        5
    youngce  
       2019-03-18 19:36:32 +08:00
    我自己基本不这么写。。。读过的一些 python 项目源码里也没有见大佬们这么写。
    主要是真的不好看吧
    whileFalse
        6
    whileFalse  
       2019-03-18 21:10:28 +08:00
    clean() if dirty else None

    我怎么觉得这句话中 clean()总是会被调用?
    Leigg
        7
    Leigg  
       2019-03-18 21:15:11 +08:00 via iPhone   1
    @whileFalse 并不会
    Leigg
        8
    Leigg  
       2019-03-18 21:43:31 +08:00 via iPhone
    py3 可以写的更优雅一点,利用省略号这种文法。
    func( ) if xx else ...
    shn7798
        9
    shn7798  
       2019-03-18 22:09:36 +08:00
    比较喜欢第一种写法,判断条件和逻辑分支识别度很高。
    第二种写法一眼看去需要花点时间去区分,看起来比较累。
    第三种写法是 Perl 时代的风格,write only,当然破解之法就是写诗,哈哈。
    Kirscheis
        10
    Kirscheis  
       2019-03-18 22:50:46 +08:00
    dity and clean() 也太危险了。。万一有一天他们决定从右边开始短路怎么办。。
    yim7
        11
    yim7  
       2019-03-18 23:14:48 +08:00
    第一种很好,逻辑清晰,第二种是被 c 洗脑的哈皮写的,后面两个都是没事找事,代码可读性最重要
    Qzier
        12
    Qzier  
       2019-03-19 00:15:01 +08:00 via iPad
    不会,因为不符合 PEP8
    jerrylogin
        13
    jerrylogin  
       2019-03-19 03:46:59 +08:00
    可以啊。。。。pylint 不会报错啊 。。。。不是和 list comprehension 很像吗
    binux
        14
    binux  
       2019-03-19 04:20:13 +08:00
    我一般只在两个场合这么写:

    1. if condition: return

    2. 多个
    if condition_a: do_a()
    if condition_b: do_b()
    if condition_c: do_c()

    但是我很多年不写 python 了。
    luckyc
        15
    luckyc  
       2019-03-19 08:39:10 +08:00
    vscode->右键->格式化文档
    Ginson
        16
    Ginson  
       2019-03-19 09:01:17 +08:00
    一般只会在简单的条件赋值上这样写,比如 x = 1 if y > 0 else 2
    aaa5838769
        17
    aaa5838769  
       2019-03-19 09:25:09 +08:00
    一般不这么干。。自己都看不下去。
    HelloAmadeus
        18
    HelloAmadeus  
       2019-03-19 09:30:49 +08:00 via iPhone
    标准库里有很多这样一行的代码
    Vegetable
        19
    Vegetable  
    OP
       2019-03-19 09:43:42 +08:00
    @whileFalse
    @Leigg
    我测试了一下
    ```
    clean() if dirty else ...
    ```
    这种写法会执行 clean(),@whileFalse 说的对
    Vegetable
        20
    Vegetable  
    OP
       2019-03-19 09:45:14 +08:00
    @whileFalse
    @Leigg

    ...不是是我看错条件了,不会
    xpresslink
        21
    xpresslink  
       2019-03-19 10:13:47 +08:00
    哪有空儿想这个,写代码时候能少按一下就少按一下。
    在 Pycharm 里面,都是提交代码前,习惯性的 Ctrl+A 然后再 Ctrl+Alt+L 一下,所以楼主说的这事儿根本不存在的。
    sazima
        22
    sazima  
       2019-03-19 10:21:05 +08:00
    不符合 PEP8
    karllynn
        23
    karllynn  
       2019-03-19 10:23:57 +08:00
    有啥不好看的,你要写 go,到处都是

    ```
    if err != nil {
    }
    ```

    不好看你也得忍着,不然根本编译不过
    D0n9
        24
    D0n9  
       2019-03-19 10:45:59 +08:00
    @Kirscheis 啊哈哈哈哈哈
    qf0129
        25
    qf0129  
       2019-03-19 13:56:02 +08:00
    自从知道有领导把代码行数作为绩效后,我再也不这样写了
    Loner233
        26
    Loner233  
       2019-03-20 13:49:07 +08:00 via Android
    一行。写 Scala 常用,反正也就写着玩,不用别人读。反正隔天自己也看不懂
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5895 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 45ms UTC 02:19 PVG 10:19 LAX 19:19 JFK 22:19
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86