跳转到主要内容

具有词汇排序的变量宽度构建号。

项目描述

lexid

lexid 是一个微型的库,用于递增词汇排序的数字ID。

在整个ID序列中,此表达式始终为真,无论您处理的是整数还是字符串

older_id < newer_id

最左边的字符/数字仅用于保持词汇顺序,以便在剩余的数字中保持序列中的位置。

此类ID可以作为构建或版本号很有用,这些号通常由不理解其正确排序的工具显示。

项目/仓库

MIT License Supported Python Versions CalVer 2021.1006 PyPI Version PyPI Downloads

代码质量/CI

GitHub CI Status GitLab CI Status Type Checked with mypy Code Coverage Code Style: sjfmt

名称 角色
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 (11.5 kB 查看哈希值

上传时间

构建分发

lexid-2021.1006-py2.py3-none-any.whl (7.6 kB 查看哈希值

上传时间 Python 2 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面