具有词汇排序的变量宽度构建号。
项目描述
lexid
lexid
是一个微型的库,用于递增词汇排序的数字ID。
在整个ID序列中,此表达式始终为真,无论您处理的是整数还是字符串
older_id < newer_id
最左边的字符/数字仅用于保持词汇顺序,以便在剩余的数字中保持序列中的位置。
此类ID可以作为构建或版本号很有用,这些号通常由不理解其正确排序的工具显示。
项目/仓库
代码质量/CI
名称 | 角色 | 自 | 至 |
---|---|---|---|
Manuel Barkhau (mbarkhau@gmail.com) | 作者/维护者 | 2020-09 | - |
用法
$ pip install lexid
$ lexid_incr 1001
1002
$ lexid_incr 1999
22000
$ lexid_incr 1
22
$ lexid_incr 1 -n 100
22
..
28
29
330
331
...
398
399
4400
4401
...
在Python中。
>>> import lexid
>>> lexid.incr("1")
'22'
>>> lexid.incr("0001")
'0002'
>>> lexid.incr("0999")
'11000'
为了避免可能的零截断问题(例如,“0001” -> “1”)并减少回滚,从更高的数字开始
>>> lexid.incr("1001")
'1002'
>>> lexid.incr("1002")
'1003'
>>> lexid.incr("1999")
'22000'
词汇ID
需要关注的关键点是填充最终可能耗尽的情况。为了保持词汇顺序,构建号以特殊方式递增。例子可能会更清楚地说明。
"0001"
"0002"
"0003"
...
"0999"
"11000"
"11001"
...
"19998"
"19999"
"220000"
"220001"
这里发生的情况是,最左边的数字提前/优先递增。每当最左边的数字将要改变时,通过乘以11来扩展id的填充。
>>> prev_id = "0999"
>>> num_digits = len(prev_id)
>>> num_digits
4
>>> prev_int = int(prev_id, 10)
>>> prev_int
999
>>> maybe_next_int = prev_int + 1
>>> maybe_next_int
1000
>>> maybe_next_id = f"{maybe_next_int:0{num_digits}}"
>>> maybe_next_id
"1000"
>>> is_padding_ok = prev_id[0] == maybe_next_id[0]
>>> is_padding_ok
False
>>> if is_padding_ok:
... # normal case
... next_id = maybe_next_id
... else:
... # extra padding needed
... next_int = maybe_next_int * 11
... next_id = str(next_int)
>>> next_id
"11000"
这种行为确保始终保留以下语义: new_version > old_version
。这将是真的,无论填充扩展与否。为了说明这个问题,考虑如果我们没有扩展填充而只是递增数字会发生什么。
"0001"
"0002"
"0003"
...
"0999"
"1000"
...
"9999"
"10000"
在这里,我们最终会遇到一个构建号,其中词汇顺序没有得到保留,因为 "10000" > "9999" == False
(因为字符串 "1"
在词汇上小于 "9"
)。如果填充足够大,这可能不是问题,但最好不必考虑这一点。
仅作为一个例子,为什么词汇顺序是一个很好的属性,有很多软件读取git标签,但没有解析版本字符串的逻辑。然而,这种软件可以使用常用的词汇顺序正确地排序版本标签。在最基本的情况下,它可以允许您使用UNIX sort
命令,例如解析VCS标签。
$ printf "v0.9.0\nv0.10.0\nv0.11.0\n" | sort
v0.10.0
v0.11.0
v0.9.0
$ printf "v0.9.0\nv0.10.0\nv0.11.0\n" | sort -n
v0.10.0
v0.11.0
v0.9.0
$ lexid_incr 0997 -n 5 | sort
0998
0999
11000
11001
11002
这种排序甚至在JavaScript中也能正常工作!
> var versions = ["11002", "11001", "11000", "0999", "0998"];
> versions.sort();
["0998", "0999", "11000", "11001", "11002"]
lexid的更改日志https://github.com/mbarkhau/lexid
2021.1006
- 小型的包装更新
2020.1005
- 首次发布(从pycalver提取)
项目详情
关闭
lexid-2021.1006.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 509a3a4cc926d3dbf22b203b18a4c66c25e6473fb7c0e0d30374533ac28bafe5 |
|
MD5 | acaceb7ce84ee319b69ae06d8e561172 |
|
BLAKE2b-256 | 600b28a3f9abc75abbf1fa996eb2dd77e1e33a5d1aac62566e3f60a8ec8b8a22 |
关闭
lexid-2021.1006-py2.py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 5526bb5606fd74c7add23320da5f02805bddd7c77916f2dc1943e6bada8605ed |
|
MD5 | d66956a88288bdd6c7b694f968ebe587 |
|
BLAKE2b-256 | cfe335764404a4b7e2021be1f88f42264c2e92e0c4720273559a62461ce64a47 |