今天踩了一个 redis-py 的坑,分享一下

2019-06-19 16:59:36 +08:00
 Livid

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 里的第一个元素就是大版本号。

19009 次点击
所在节点    Redis
37 条回复
bytelee
2019-06-26 09:23:48 +08:00
同碰到,当时以为自己傻逼了。。。。后来看了下文档,发现次序变了。然后就显示给参数了
ddup
2019-06-26 09:30:03 +08:00
这。。。还是喜欢强类型库,随便怎么重构也不担心,编译就报错了。
Takamine
2019-06-26 11:51:37 +08:00
如果用 IDE 的话在键入参数的时候应该是有参数提示的哇。
tiedan
2019-06-26 12:06:52 +08:00
哈哈哈,我踩过这个坑
hubqin
2019-06-26 12:16:48 +08:00
难怪我周末看 redis in action,有个例子运行老是出错,耗费了我好多时间。还有 zadd,redis-py3.0 版本下,第二个参数是字典类型,没想到 zincrby 也不用一样。这个改动估计是要跟随 redis 原生命令的参数顺序。
onlyice
2019-06-26 15:05:59 +08:00
虽然挺坑,但是人家文档也是描述了这个事情的: https://github.com/andymccurdy/redis-py/tree/3.2.1#zincrby
midtin
2019-06-26 18:36:10 +08:00
人家文档都写清楚了,升级大版本不看清文档怪谁呢。。
mooncakejs
2019-06-26 18:43:35 +08:00
py 这种坑太多了,上梁不正下梁歪。
sobigfish
2019-06-26 18:51:04 +08:00
正常增减应该是新建个方法 原来的设为弃用 Deprecated 吧
vast0906
2019-06-26 18:57:35 +08:00
yaml 3.6 和 5.1 load 差别貌似更大
itskingname
2019-06-26 20:00:10 +08:00
我录了一个视频,来说明这些改动: http://www.bilibili.com/video/av48634169
okoook
2019-06-26 20:12:00 +08:00
php 里面的参数是正常顺序,py 前一版都是颠倒的,重写很烦,这次升级结束,发现新版又正回来了,又又又得重写
cz5424
2019-06-26 23:07:23 +08:00
zadd 也是坑
icylogic
2019-06-27 08:23:50 +08:00
强类型也不一定能解决啊,调换顺序的参数可能类型一样啊。这要覆盖很好的测试才有可能测出来。
所以
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.
icylogic
2019-06-27 08:26:32 +08:00
所以建议再看一遍这些 breaking changes,说不定又能发现隐藏的新坑。
Livid
2019-06-27 13:05:57 +08:00
@icylogic requirements.txt 里几十个库,大家有什么好的方法来追踪最新的 breaking change 呢?
phy25
2019-09-01 06:49:55 +08:00
@Livid #36 requirements.txt 通常是用 pip freeze 固定版本的,如果版本有升级可以手动发现?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/575539

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX