python - 在等号后插入换行符在python3.8中自我记录f字符串
问题描述
在 python3.8 中,一个新功能是自我记录格式字符串。通常会这样做的地方:
>>> x = 10.583005244
>>> print(f"x={x}")
x=10.583005244
>>>
现在可以做到这一点,减少重复:
>>> x = 10.583005244
>>> print(f"{x=}")
x=10.583005244
>>>
这对于单行字符串表示非常有效。但请考虑以下情况:
>>> import numpy as np
>>> some_fairly_long_named_arr = np.random.rand(4,2)
>>> print(f"{some_fairly_long_named_arr=}")
some_fairly_long_named_arr=array([[0.05281443, 0.06559171],
[0.13017109, 0.69505908],
[0.60807431, 0.58159127],
[0.92113252, 0.4950851 ]])
>>>
在这里,第一行没有对齐,这(可以说)是不可取的。我宁愿更喜欢以下输出:
>>> import numpy as np
>>> some_fairly_long_named_arr = np.random.rand(4,2)
>>> print(f"some_fairly_long_named_arr=\n{some_fairly_long_named_arr!r}")
some_fairly_long_named_arr=
array([[0.06278696, 0.04521056],
[0.33805303, 0.17155518],
[0.9228059 , 0.58935207],
[0.80180669, 0.54939958]])
>>>
在这里,输出的第一行也是对齐的,但这违背了在 print 语句中不重复变量名两次的目的。
该示例是一个 numpy 数组,但它也可能是一个 pandas 数据框等。
因此,我的问题是:是否可以在自记录字符串中的 = 符号之后插入换行符?
我试图像这样添加它,但它不起作用:
>>> print(f"{some_fairly_long_named_arr=\n}")
SyntaxError: f-string expression part cannot include a backslash
我阅读了有关 format-specification-mini-language 的文档,但是那里的大多数格式仅适用于整数等简单数据类型,并且我无法使用那些有效的格式来实现我想要的。
很抱歉写了这么长的文章。
解决方案
根本不推荐这个,但为了可能:
import numpy as np
_old_array2string = np.core.arrayprint._array2string
def _array2_nice_string(*args, **kwargs):
non_nice_string = _old_array2string(*args, **kwargs)
dimension_strings = non_nice_string.split("\n")
if len(dimension_strings) > 1:
dimension_string = dimension_strings[1]
dimension_indent = len(dimension_string) - len(dimension_string.lstrip())
return "\n" + " " * dimension_indent + non_nice_string
return non_nice_string
np.core.arrayprint._array2string = _array2_nice_string
输出:
some_fairly_long_named_arr = np.random.rand(2, 2)
print(f"{some_fairly_long_named_arr=}")
some_fairly_long_named_arr=array(
[[0.95900608, 0.79367873],
[0.58616975, 0.17757661]])
和
some_fairly_long_named_arr = np.random.rand(1, 2)
print(f"{some_fairly_long_named_arr=}")
some_fairly_long_named_arr=array([[0.62492772, 0.80453153]])
.
我这样做了,如果第一个维度是1
,它会保持在同一条线上。
np.array2string
我尝试重新分配一种非内部方法,但我从未得到过该方法。如果有人能找到一种方法来重新分配该公共功能而不是这个内部使用的功能,我想这会使这个解决方案更加简洁。
推荐阅读
- r - 无法在可能的正则表达式中返回 10
- data-mining - 我们如何区分数据挖掘中的噪声和异常值
- angular - 如何将任何 [] 转换为可观察的
在角度 6 - compiler-errors - 使用 cmake 构建带有 cpp 和 cuda 源的 pybind11 模块
- node.js - Meteor 部署到 DigitalOcean
- android - 多个 requestLocationUpdates 正在运行
- python - 关于使用python编程的类、子类和属性的概念问题
- r - R在更改列名时通过id和子id合并两个data.frame?
- c++ - KMDF 驱动程序无法构建 VS 2017
- kubernetes - 使用部署 YAML 文件从 Helm Chart 访问 Dockerhub 注册表图像