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 · 6173 次点击
    这是一个创建于 2078 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有时候判断一个条件,决定是不是执行一个方法. 今天看了一下自己写的代码里,出现了不少这种类似的判断,写的时候没多想,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
    dirty 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 了。
    l4ever
        15
    l4ever  
       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   ·   实用小工具   ·   1374 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 17:20 · PVG 01:20 · LAX 09:20 · JFK 12:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.