Redis 的 Python 客户端的 zincrby
的参数顺序在 redis-py 3 里改了。
在 redis-py 2 里是:
def zincrby(self, name, value, amount=1):
在 redis-py 3 里是:
def zincrby(self, name, amount, value):
具体的改动是这个 commit:
https://github.com/andymccurdy/redis-py/commit/a750c7946d41862a38955c35b6928f098911c406
本来觉得这种基础库上不太可能发生这种事情,直到今天在用 Docker 搭一个新开发环境的时候……
如果要同时兼容两种情况的话,可以这样做:
import redis print(redis.VERSION)
redis.VERSION
里的第一个元素就是大版本号。
![]() | 1 enzo113 2019-06-19 17:06:40 +08:00 ![]() 这改动确实反人类。 我想到了一个别的解决方法:可以显式的把参数写出来,如 amount=1, value="2", 调用的时候就能无视顺序了。 |
![]() | 2 Ct5T66PVR1bW7b2z 2019-06-19 17:07:23 +08:00 via Android 这个是个坑,之前遇到过 |
![]() | 3 chengxiao 2019-06-19 17:07:37 +08:00 今天我也发现一个 pymongo 的坑 Mongodb 从 3.6 版本开始就支持字典 key 包含. $等特殊符号了 但是在 pymongo 里还是会做拼写检查,需要到 site-package 里把 collection 把 check_key=True 改 False 即可 |
![]() | 4 opengps 2019-06-19 17:45:29 +08:00 ![]() 这种改动还不如加个新方法 |
![]() | 5 jamfer 2019-06-19 17:47:23 +08:00 这.... 还带这么玩儿的??? |
![]() | 6 Valid 2019-06-19 17:49:10 +08:00 最骚的是 amount |
![]() | 7 scriptB0y 2019-06-19 17:59:47 +08:00 可以理解吧,可能一开始作者是想设置一个 default 的 increment=1,然后就将带默认值的参数放到最后面了。 后来有人提出这跟 redis 原生的命令相反了 github.com/andymccurdy/redis-py/issues/571 然后作者就改回去了。 |
![]() | 8 cominghome 2019-06-19 18:37:20 +08:00 ![]() 一直是显示传参,但是这个改动确实坑 |
![]() | 9 xiaolanger 2019-06-19 19:26:59 +08:00 上次用这个的时候,也是仔细看了看文档 |
![]() | 10 iPhoneXI 2019-06-19 19:43:19 +08:00 ![]() redis py setex 顺序也是坑,还是指定关键字完事 |
![]() | 11 wsbnd9 2019-06-19 20:20:00 +08:00 ![]() python3 StrictRedis zadd 坑 import redis r = redis.Redis(...) if redis.VERSION[0] < 3: r.zadd('my-key', element1=score1) else: r.zadd('my-key', {element1: score1}) 这个也是坑 |
12 Yyyye 2019-06-19 20:38:43 +08:00 为什么不直接添加一个新方法呢! |
![]() | 13 mengyaoss77 2019-06-19 20:39:50 +08:00 via Android 感觉 redis 的有序集合操作语义很奇怪啊 member 在后 score 在前。。 |
14 phy25 2019-06-19 21:41:29 +08:00 via Android ![]() |
![]() | 15 Ehco1996 2019-06-20 07:31:06 +08:00 还有 exists 的返回值从 None 变为 0 了 |
![]() | 16 Mithrandir 2019-06-20 09:54:45 +08:00 所以要读 changelog |
![]() | 18 NVDA 2019-06-20 10:16:42 +08:00 ....居然还能这么换顺序的 |
19 fireindark 2019-06-20 17:14:40 +08:00 pika 的 python2 和 python3 也有这个问题 |
![]() | 20 coolzilj 2019-06-20 17:54:13 +08:00 大版本更新有 backwards incompatible changes 也很正常吧 |
21 bytelee 2019-06-26 09:23:48 +08:00 同碰到,当时以为自己傻逼了。。。。后来看了下文档,发现次序变了。然后就显示给参数了 |
![]() | 22 ddup 2019-06-26 09:30:03 +08:00 这。。。还是喜欢强类型库,随便怎么重构也不担心,编译就报错了。 |
![]() | 23 Takamine 2019-06-26 11:51:37 +08:00 如果用 IDE 的话在键入参数的时候应该是有参数提示的哇。 |
![]() | 24 tiedan 2019-06-26 12:06:52 +08:00 哈哈哈,我踩过这个坑 |
25 hubqin 2019-06-26 12:16:48 +08:00 难怪我周末看 redis in action,有个例子运行老是出错,耗费了我好多时间。还有 zadd,redis-py3.0 版本下,第二个参数是字典类型,没想到 zincrby 也不用一样。这个改动估计是要跟随 redis 原生命令的参数顺序。 |
![]() | 26 onlyice 2019-06-26 15:05:59 +08:00 虽然挺坑,但是人家文档也是描述了这个事情的: https://github.com/andymccurdy/redis-py/tree/3.2.1#zincrby |
27 midtin 2019-06-26 18:36:10 +08:00 人家文档都写清楚了,升级大版本不看清文档怪谁呢。。 |
28 mooncakejs 2019-06-26 18:43:35 +08:00 py 这种坑太多了,上梁不正下梁歪。 |
![]() | 29 run2 2019-06-26 18:51:04 +08:00 正常增减应该是新建个方法 原来的设为弃用 Deprecated 吧 |
30 vast0906 2019-06-26 18:57:35 +08:00 yaml 3.6 和 5.1 load 差别貌似更大 |
![]() | 31 itskingname 2019-06-26 20:00:10 +08:00 via iPhone 我录了一个视频,来说明这些改动: http://www.bilibili.com/video/av48634169 |
![]() | 32 okoook 2019-06-26 20:12:00 +08:00 via iPhone php 里面的参数是正常顺序,py 前一版都是颠倒的,重写很烦,这次升级结束,发现新版又正回来了,又又又得重写 |
![]() | 33 cz5424 2019-06-26 23:07:23 +08:00 via iPhone zadd 也是坑 |
![]() | 34 icylogic 2019-06-27 08:23:50 +08:00 via iPad 强类型也不一定能解决啊,调换顺序的参数可能类型一样啊。这要覆盖很好的测试才有可能测出来。 所以 1. Named args 2. Major Version 升级要慎重,至少不能连升级指南都不看,changelog 里的 breaking changes 都不看。按照 semantic version 的约定,Major 版本更改就是允许破坏性更新存在的。除了楼上提到的升级指南,不出意外地在 changelog 里找到了 * 3.0.0 BACKWARDS INCOMPATIBLE CHANGES ... * ZINCRBY arguments 'value' and 'amount' have swapped order to match the the Redis server. The new argument order is: keyname, amount, value. * MGET no longer raises an error if zero keys are passed in. Instead an empty list is returned. * MSET and MSETNX now require all keys/values to be specified in a single dictionary argument named mapping. This was changed to allow for future options to these commands in the future. * ZADD now requires all element names/scores be specified in a single dictionary argument named mapping. This was required to allow the NX, XX, CH and INCR options to be specified. |
![]() | 35 icylogic 2019-06-27 08:26:32 +08:00 via iPad 所以建议再看一遍这些 breaking changes,说不定又能发现隐藏的新坑。 |
![]() | 36 Livid MOD OP PRO @icylogic requirements.txt 里几十个库,大家有什么好的方法来追踪最新的 breaking change 呢? |
37 phy25 2019-09-01 06:49:55 +08:00 via Android @Livid #36 requirements.txt 通常是用 pip freeze 固定版本的,如果版本有升级可以手动发现? |