推荐学习书目
› 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
u14e
V2EX  ›  Python

大家写 Python 时,有使用过第二种 dict.get 吗

  •  
  •   u14e · Apr 19, 2018 · 4918 views
    This topic created in 3122 days ago, the information mentioned may be changed or developed.

    刚在 https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iii-web-forms 评论下面看到作者说起下面这两种写法的区别,想问问 v 友用的是哪种

    # case1
    SECRET_KEY = os.environ.get('SECRET_KEY', 'Your Majesty')
    
    # case2
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'Your Majesty'
    
    27 replies  •  2018-05-02 14:32:56 +08:00
    chroming
    chroming
    Apr 19, 2018 via Android
    1
    get 可以指定默认值
    chroming
    chroming
    Apr 19, 2018 via Android
    2
    看错了。加 or 的太不优雅了,没用过
    doubleflower
    doubleflower
    Apr 19, 2018
    3
    就环境变量当然是后者了,万一给环境设置一个空值呢,前一个还是会得到空
    SimbaPeng
    SimbaPeng
    Apr 19, 2018
    4
    第二种又不是 dict.get 特有的,是很普通的短路求值
    SimbaPeng
    SimbaPeng
    Apr 19, 2018
    5
    看场景需求,第一个是不存在使用备用值,第二个是不为真使用备用值
    orangeade
    orangeade
    Apr 19, 2018 via Android
    6
    还有一种是 collections 里的 default dict,更方便一些
    bobuick
    bobuick
    Apr 19, 2018❤️1
    7
    没看出来第 2 种用法,可能会存在不一样的逻辑么。

    if None or 2 可以得到 2, if '' or 2 也可以得到 2 的, py 里 False 有很多种数据零值都会是 False

    第一种里面只有取不到 Key 的 val 的时候,才会用提供的 default 值。
    u14e
    u14e
    OP
    Apr 19, 2018
    8
    @bobuick 区别作者已经说过了,我就是看看大家平时用的是哪种
    u14e
    u14e
    OP
    Apr 19, 2018
    9
    @SimbaPeng @doubleflower 大佬好理性
    shihira
    shihira
    Apr 19, 2018
    10
    当然是第一种。第二种太奇怪了,摆着好好的内建参数不用,另辟蹊径还多出点 bug。
    kindjeff
    kindjeff
    Apr 19, 2018
    11
    当然是 os.environ['SECRET_KEY']
    kindjeff
    kindjeff
    Apr 19, 2018
    12
    环境变量没设的,应该直接 crash
    phithon
    phithon
    Apr 19, 2018
    13
    只在 django 里见过
    lance6716
    lance6716
    Apr 19, 2018 via Android
    14
    我是遵循 EAFP 原则,虽然 try except 多了有点丑
    lolizeppelin
    lolizeppelin
    Apr 19, 2018 via Android
    15
    用啊 一定不能为 k 不允许为 none 的时候 肯定用第二种啊
    lolizeppelin
    lolizeppelin
    Apr 19, 2018 via Android
    16
    一般用 1 有需求就用 2

    常见的用在 json 校验之后

    前端有时候并不是那么方便弹出多余 key
    所以校验要允许 key 为 null
    但是取值的时候又要禁止空值 这时候就要用上 2 了
    est
    est
    Apr 20, 2018
    17
    {"key": null}

    所以要用第二种。
    maemual
    maemual
    Apr 20, 2018 via iPhone❤️1
    18
    上面很多人没看懂啊,这两种写法的意义是完全不一样的
    u14e
    u14e
    OP
    Apr 20, 2018
    19
    @lolizeppelin 谢谢大佬的分享
    reself
    reself
    Apr 20, 2018 via Android
    20
    @shihira 两者逻辑是不一样的
    vakara
    vakara
    Apr 20, 2018
    21
    有用过啊,
    第一个是处理没有这个环境变量,返回后面的默认值。
    第二个是指定环境变量默认值(可以没有,可以为空),返回默认值。
    vipppppp
    vipppppp
    Apr 20, 2018
    22
    这个链接是 flask
    。。之前中途接手了一个 flask 项目,由于前后端没有沟通好,很无奈采取了一个很蛋疼的操作。
    举个简单的例子:
    index = request.value.get('index', 0)
    可是这个我的 index 要是一个整数!!
    然后 get 请求的参数一般是 string 类型。。
    于是我:
    index = int(request.value.get('index', 0))
    可是无奈的是,有时 url 是?index=&...
    index 来了个 None 值。。
    于是:
    index = int(request.value.get('index') or 0)
    T_T
    di94sh
    di94sh
    Apr 20, 2018 via Android
    23
    @vipppppp 我记得可以这样写
    index= request.value. get('index', 0, type= int)
    OldPanda
    OldPanda
    Apr 20, 2018
    24
    一般都是写成 SECRET_KEY = os.getenv('SECRET_KEY', 'Your Majesty')
    v4dc
    v4dc
    Apr 20, 2018
    25
    ```python

    In [1]: di = {'a': 0}

    In [2]: di.get('a') or 1
    Out[2]: 1

    In [3]: di.get('a', 1)
    Out[3]: 0
    ```
    Kylin30
    Kylin30
    Apr 25, 2018
    26
    又学一招,感谢。
    smdbh
    smdbh
    May 2, 2018
    27
    感谢,正好用到,会看复习下。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4080 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 87ms · UTC 01:07 · PVG 09:07 · LAX 17:07 · JFK 20:07
    ♥ Do have faith in what you're doing.