推荐学习书目
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 · 4531 views
    This topic created in 2949 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
        1
    chroming  
       Apr 19, 2018 via Android
    get 可以指定默认值
    chroming
        2
    chroming  
       Apr 19, 2018 via Android
    看错了。加 or 的太不优雅了,没用过
    doubleflower
        3
    doubleflower  
       Apr 19, 2018
    就环境变量当然是后者了,万一给环境设置一个空值呢,前一个还是会得到空
    SimbaPeng
        4
    SimbaPeng  
       Apr 19, 2018
    第二种又不是 dict.get 特有的,是很普通的短路求值
    SimbaPeng
        5
    SimbaPeng  
       Apr 19, 2018
    看场景需求,第一个是不存在使用备用值,第二个是不为真使用备用值
    orangeade
        6
    orangeade  
       Apr 19, 2018 via Android
    还有一种是 collections 里的 default dict,更方便一些
    bobuick
        7
    bobuick  
       Apr 19, 2018   ❤️ 1
    没看出来第 2 种用法,可能会存在不一样的逻辑么。

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

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

    常见的用在 json 校验之后

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

    所以要用第二种。
    maemual
        18
    maemual  
       Apr 20, 2018 via iPhone   ❤️ 1
    上面很多人没看懂啊,这两种写法的意义是完全不一样的
    u14e
        19
    u14e  
    OP
       Apr 20, 2018
    @lolizeppelin 谢谢大佬的分享
    reself
        20
    reself  
       Apr 20, 2018 via Android
    @shihira 两者逻辑是不一样的
    vakara
        21
    vakara  
       Apr 20, 2018
    有用过啊,
    第一个是处理没有这个环境变量,返回后面的默认值。
    第二个是指定环境变量默认值(可以没有,可以为空),返回默认值。
    vipppppp
        22
    vipppppp  
       Apr 20, 2018
    这个链接是 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
        23
    di94sh  
       Apr 20, 2018 via Android
    @vipppppp 我记得可以这样写
    index= request.value. get('index', 0, type= int)
    OldPanda
        24
    OldPanda  
       Apr 20, 2018
    一般都是写成 SECRET_KEY = os.getenv('SECRET_KEY', 'Your Majesty')
    v4dc
        25
    v4dc  
       Apr 20, 2018
    ```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
        26
    Kylin30  
       Apr 25, 2018
    又学一招,感谢。
    smdbh
        27
    smdbh  
       May 2, 2018
    感谢,正好用到,会看复习下。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2985 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 100ms · UTC 07:51 · PVG 15:51 · LAX 00:51 · JFK 03:51
    ♥ Do have faith in what you're doing.