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

大家来找茬?

  •  
  •   skywatcher · 2015-12-25 20:48:15 +08:00 · 2412 次点击
    这是一个创建于 3291 天前的主题,其中的信息可能已经有所发展或是发生改变。
    def setWithTimestamp(key, val, timestamp = datetime.now()):
        mc.set(key, {"timestamp" : timestamp, "data" : val})
    

    这段代码有没有茬?

    8 条回复    2015-12-29 23:26:36 +08:00
    xufang
        1
    xufang  
       2015-12-25 20:50:28 +08:00 via Android
    这是常见 python 陷阱, maillist 和 stackoverflow 上声讨 python 这个特性很多次了。
    bdbai
        2
    bdbai  
       2015-12-25 21:12:16 +08:00 via iPhone
    @xufang 弱弱问一下,是不是 `timestamp` 的值在脚本解释时已经定了?
    skywatcher
        3
    skywatcher  
    OP
       2015-12-25 21:20:08 +08:00
    @xufang 是的,刚测了, C++没这个问题
    skywatcher
        4
    skywatcher  
    OP
       2015-12-26 16:13:47 +08:00
    @bdbai Python 不太一样,当默认参数为函数时,运行程序那一刻就已经生成了固定的默认参数,以后都不变(如果默认值为 list 、 dict 等还能被修改而对下次函数调用默认值产生影响)
    bdbai
        5
    bdbai  
       2015-12-26 16:28:49 +08:00 via iPhone
    @skywatcher 嗯,我的意思是,对于上面代码,在没有人为修改 `timestamp` 值的情况下,不管程序 sleep 多久,`timestamp` 的值总是不变的。这样理解对吗?
    decaywood
        6
    decaywood  
       2015-12-28 10:33:52 +08:00
    最近踩过的坑:
    ```python
    def setWithTimestamp(key, val, timestamp = NONE):
    timestamp = datetime.now() if timestamp is NONE else timestamp
    ```
    skywatcher
        7
    skywatcher  
    OP
       2015-12-29 23:16:54 +08:00
    @decaywood 感觉完全没必要,应为如果你的程序不会被中断的话,每次都会执行 if 判断并执行 timestamp=datetime.now(),所以要么去掉默认参数,要么每次调用前必须赋值,感觉还减少了 if 判断。
    skywatcher
        8
    skywatcher  
    OP
       2015-12-29 23:26:36 +08:00
    @bdbai 程序 sleep?没太理解你的意思。运行时确定,以后每次调用都是调用相同的函数,包括参数值, dict 、 list 等做默认参数时会出现下次调用时为被修改过的值,具体可以查 python 参数默认值陷阱
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2572 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 10:27 · PVG 18:27 · LAX 02:27 · JFK 05:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.