在 python3.8 中的自记录 f 字符串中等号后插入换行符
Insert newline after equals sign in self documenting f-string in python3.8
有了 python3.8,一个新功能是 self documenting format strings。人们通常会在哪里这样做:
>>> 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]])
>>>
在这里,输出的第一行也是对齐的,但是它违背了打印语句中不重复变量名两次的目的。
该示例是一个 numpy 数组,但它也可能是一个 pandas 数据帧等。
因此,我的问题是:自文档字符串中=号后可以插入换行符吗?
我试过这样添加,但是不行:
>>> print(f"{some_fairly_long_named_arr=\n}")
SyntaxError: f-string expression part cannot include a backslash
我读过 the docs on 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
我试图重新分配,但我从未使它起作用。如果有人能找到一种方法来重新分配 public 函数而不是这个内部使用的函数,我想这会使这个解决方案更清晰。
阅读 CPython source:
后,我想出了一个方法来完成我想要的
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.23560777, 0.96297907],
[0.18882751, 0.40712246],
[0.61351814, 0.1981144 ],
[0.27115495, 0.72303859]])
我更喜欢在单行中工作的解决方案,但这似乎是目前唯一的方法。也许在以后的python版本中会实现另一种方式。
但是请注意,对于上述方法,必须删除续行上的缩进,因此:
# ...some code with indentation...
print(f"""{some_fairly_long_named_arr =
}""")
# ...more code with indentation...
否则第一行的对齐又被破坏了
我尝试使用 inspect.cleandoc and textwrap.dedent 来缓解这个问题,但无法解决缩进问题。但也许这是另一个问题的主题。
有了 python3.8,一个新功能是 self documenting format strings。人们通常会在哪里这样做:
>>> 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]])
>>>
在这里,输出的第一行也是对齐的,但是它违背了打印语句中不重复变量名两次的目的。
该示例是一个 numpy 数组,但它也可能是一个 pandas 数据帧等。
因此,我的问题是:自文档字符串中=号后可以插入换行符吗?
我试过这样添加,但是不行:
>>> print(f"{some_fairly_long_named_arr=\n}")
SyntaxError: f-string expression part cannot include a backslash
我读过 the docs on 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
我试图重新分配,但我从未使它起作用。如果有人能找到一种方法来重新分配 public 函数而不是这个内部使用的函数,我想这会使这个解决方案更清晰。
阅读 CPython source:
后,我想出了一个方法来完成我想要的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.23560777, 0.96297907],
[0.18882751, 0.40712246],
[0.61351814, 0.1981144 ],
[0.27115495, 0.72303859]])
我更喜欢在单行中工作的解决方案,但这似乎是目前唯一的方法。也许在以后的python版本中会实现另一种方式。
但是请注意,对于上述方法,必须删除续行上的缩进,因此:
# ...some code with indentation...
print(f"""{some_fairly_long_named_arr =
}""")
# ...more code with indentation...
否则第一行的对齐又被破坏了
我尝试使用 inspect.cleandoc and textwrap.dedent 来缓解这个问题,但无法解决缩进问题。但也许这是另一个问题的主题。