跳转到主要内容

跟踪字符串中的组件,尤其是在f字符串中的格式化值。

项目描述

值记录

Build Status Coverage Status

这是一个用于跟踪字符串中组件组合的Python库。特别是,它允许您将f字符串中的格式化值分离出来。以下是一个示例

from fvalues import F, FValue

x = 1.2345
f = F(f"twice x is {x * 2:.2f}")
assert f == "twice x is 2.47"
assert f.parts == ("twice x is ", FValue(source="x * 2", value=2.469, formatted="2.47"))

关键事实

  • Fstr 的子类,因此它可以像任何其他字符串一样一般使用。
  • 使用 executing 库魔术般地检测对构造函数 F() 的调用,并解析f字符串以提取其组件。
  • 这些保存在属性 F.parts 中。每个 part 要么是一个表示常量部分的 str,要么是一个表示动态表达式的 FValue
  • FValue.source 包含大括号 ({}) 之间但冒号 (:) 和格式说明符 (.2f) 之前的源代码。在某些情况下,它可能不是确切的原始源代码,而是由 ast.unparse 产生的等效代码。
  • FValue.valueFValue.formatted 使用 eval() 计算,所以 请小心处理您不希望多次评估的表达式,因为性能或副作用

在ICE中的使用

这个库是为了增强交互式组合探索器(ICE)而构建的。在下面的屏幕截图中,右侧“输入”下的提示是一个F对象,而彩色文本对应于动态的FValue

ICE screenshot

连接

F类还特别支持与+运算符的连接。

f += "!"
assert f == "twice x is 2.47!"
assert f.parts == (
    FValue(
        source="f",
        value="twice x is 2.47",
        formatted="twice x is 2.47",
    ),
    "!",
)

类似于解构f-string,你可以看到在+=左侧的动态表达式f如何被区分开来,表示为FValue,而右侧的静态"!"

展平

在上面的断言中,FValue.value显示为普通字符串,但请记住,它实际上也是一个F对象。这个断言之所以有效,是因为Fstr的子类,所以它们可以互换使用。但它仍然具有我们之前看到的相同的parts。有时保留部分树的原貌可能很有用,有时你可能希望将所有内容都带到表面以便更容易处理。你可以使用F.flatten生成具有扁平部分列表的等效F对象。

assert f.flatten().parts == (
    "twice x is ",
    FValue(
        source="x * 2",
        value=2.469,
        formatted="2.47",
    ),
    "!",
)

其他字符串方法

大多数F方法(例如.lower())直接从str继承,这意味着它们返回一个普通的str而不是另一个F对象。所以如果你不希望丢失部分信息,请小心使用这些方法!以下方法有专门的实现来避免这种情况。未来可能会添加更多。

strip

F.strip在整体字符串方面与通常的str.strip做同样的事情,但也会按照你可能会期望的方式去除内部部分。有关更多详细信息,请参阅文档字符串。相关方法lstriprstrip按预期去除左右两侧。

请确保编写F(f"..."").strip()而不是F(f"..."'.strip()),否则f-string的魔法将不起作用。

join

separator.join(strings)只有在separator是一个F对象时才会返回一个F对象。如果separator是一个普通的str,则结果将是一个普通的str,即使strings是一个包含F对象的列表。在实际应用中,这通常意味着你应该编写例如F(" ").join(strings)而不是" ".join(strings)

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

fvalues-0.0.4.tar.gz (327.2 kB 查看哈希值)

上传时间

构建分发

fvalues-0.0.4-py3-none-any.whl (9.2 kB 查看哈希值)

上传时间 Python 3

支持者