启用折叠表达式的省略技巧
parameterpack的Python项目详细描述
参数包
这个模块提供了一个机制,用于编写类似于Python中的C++ 17的{a1}的东西。这是 通过选择python的大部分未使用的Ellipsisliteral来实现。
支持的运算符
- 加法(+)
- 减法(-)
- 乘法(*)
- 整数除法(//)
- 除法(/)
- 模数(%)
- 矩阵乘法(@,仅限python>;=3.5)
- 按位与(&)
- 按位或(|)
- 按位异或(^)
- 左移(<<)
- 右移(>>)
- __call__
- 比较运算符(>,>=,<,<=,==,!=)
示例
在参数包上“折叠”操作有两种方法:left和right折叠。
fromparameterpackimportpackp=pack(1,2,3)# Left foldp-...# (1 - 2) - 3 = -4p-...-4# ((1 - 2) - 3) - 4 = -8# Right fold...-p# 1 - (2 - 3) = 2...-p-4# 4 - (1 - (2 - 3)) = -2
请注意,左折叠组在左侧操作,而右折叠组在右侧操作。这只会 如果折叠操作不是关联操作(例如整数减法)的差异。
因为无法重新定义ellipsis类型的运算符,所以在二进制文件的右侧有一个右折 操作需要括号。
fromparameterpackimportpackp=pack(1,2,3)# This is an error because "4 - ..." is evaluated first.4-...-p# This is what you should do instead.4-(...-p)# 4 - (3 - (2 - 1)) = 2
您可能更喜欢在任何情况下使用括号,以保持语法清晰,避免这种潜在的疏忽。
条件链也得到支持,但它们的工作方式与其他折叠略有不同。
fromparameterpackimportpackp=pack(1,2,3)# Python evaluates "a < b < c" as "a < b and b < c", so this module does the same.p<...# 1 < 2 < 3 = True, so 3 is returned.p<...<4# 1 < 2 < 3 < 4 = Truep<...<0# 1 < 2 < 3 < 0 = Falsep=pack(3,2,1)p<...# 3 < 2 < 1 = False, so a special False-comparing object is returned....<p# 3 > 2 > 1 = True
由于python没有用于比较运算符的反转参数形式,因此条件语句的工作方式略有不同。 如果在参数包的元素上折叠比较会导致False,从而使整个 比较链,它将返回一个特殊的对象,该对象将返回False以进行进一步的比较。否则, 返回参数包的最后一个元素,以便比较链可以继续。
运行测试
要在系统的python解释器中运行此模块的测试,只需从 存储库根目录。
要在所有受支持的解释器中运行测试,首先确保每个受支持的python解释器都安装在 系统并添加到环境变量中。然后从存储库根目录运行pip install -e .[dev]到 安装开发依赖项,然后从存储库根目录运行tox以运行测试。
错误报告和功能请求
请使用issue tracker提交错误或请求功能。