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
u14e
V2EX  ›  Python

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

  •  
  •   u14e · 2018-04-19 19:20:33 +08:00 · 4029 次点击
    这是一个创建于 2411 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    常见的用在 json 校验之后

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

    所以要用第二种。
    maemual
        18
    maemual  
       2018-04-20 00:38:44 +08:00 via iPhone   ❤️ 1
    上面很多人没看懂啊,这两种写法的意义是完全不一样的
    u14e
        19
    u14e  
    OP
       2018-04-20 00:45:31 +08:00
    @lolizeppelin 谢谢大佬的分享
    reself
        20
    reself  
       2018-04-20 01:08:45 +08:00 via Android
    @shihira 两者逻辑是不一样的
    vakara
        21
    vakara  
       2018-04-20 10:15:36 +08:00
    有用过啊,
    第一个是处理没有这个环境变量,返回后面的默认值。
    第二个是指定环境变量默认值(可以没有,可以为空),返回默认值。
    vipppppp
        22
    vipppppp  
       2018-04-20 11:27:07 +08:00
    这个链接是 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  
       2018-04-20 11:39:28 +08:00 via Android
    @vipppppp 我记得可以这样写
    index= request.value. get('index', 0, type= int)
    OldPanda
        24
    OldPanda  
       2018-04-20 14:13:29 +08:00
    一般都是写成 SECRET_KEY = os.getenv('SECRET_KEY', 'Your Majesty')
    aliao0019
        25
    aliao0019  
       2018-04-20 16:35:53 +08:00
    ```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  
       2018-04-25 01:25:37 +08:00
    又学一招,感谢。
    smdbh
        27
    smdbh  
       2018-05-02 14:32:56 +08:00
    感谢,正好用到,会看复习下。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4767 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:14 · PVG 09:14 · LAX 17:14 · JFK 20:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.