首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

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

  •  
  •   u14e · 275 天前 · 2689 次点击
    这是一个创建于 275 天前的主题,其中的信息可能已经有所发展或是发生改变。

    刚在 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 回复  |  直到 2018-05-02 14:32:56 +08:00
        1
    chroming   275 天前 via Android
    get 可以指定默认值
        2
    chroming   275 天前 via Android
    看错了。加 or 的太不优雅了,没用过
        3
    doubleflower   275 天前
    就环境变量当然是后者了,万一给环境设置一个空值呢,前一个还是会得到空
        4
    SimbaPeng   275 天前
    第二种又不是 dict.get 特有的,是很普通的短路求值
        5
    SimbaPeng   275 天前
    看场景需求,第一个是不存在使用备用值,第二个是不为真使用备用值
        6
    orangeade   275 天前 via Android
    还有一种是 collections 里的 default dict,更方便一些
        7
    bobuick   275 天前   ♥ 1
    没看出来第 2 种用法,可能会存在不一样的逻辑么。

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

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

    常见的用在 json 校验之后

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

    所以要用第二种。
        18
    maemual   275 天前 via iPhone   ♥ 1
    上面很多人没看懂啊,这两种写法的意义是完全不一样的
        19
    u14e   275 天前
    @lolizeppelin 谢谢大佬的分享
        20
    reself   275 天前 via Android
    @shihira 两者逻辑是不一样的
        21
    vakara   274 天前
    有用过啊,
    第一个是处理没有这个环境变量,返回后面的默认值。
    第二个是指定环境变量默认值(可以没有,可以为空),返回默认值。
        22
    vipppppp   274 天前
    这个链接是 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
        23
    di94sh   274 天前 via Android
    @vipppppp 我记得可以这样写
    index= request.value. get('index', 0, type= int)
        24
    OldPanda   274 天前
    一般都是写成 SECRET_KEY = os.getenv('SECRET_KEY', 'Your Majesty')
        25
    aliao0019   274 天前
    ```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
    ```
        26
    Kylin30   270 天前
    又学一招,感谢。
        27
    smdbh   262 天前
    感谢,正好用到,会看复习下。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1227 人在线   最高记录 4236   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 18ms · UTC 17:40 · PVG 01:40 · LAX 09:40 · JFK 12:40
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1