如何将字符串格式作为变量传递给 f-字符串

27

我正在使用f-strings,需要定义一个依赖于变量的格式。

def display_pattern(n):
    temp = ''
    for i in range(1, n + 1):
        temp = f'{i:>3}' + temp
        print(temp)
如果相关的话,display_pattern(5) 的输出结果是:
  1
  2  1
  3  2  1
  4  3  2  1
  5  4  3  2  1

我想知道是否可能操作格式>3并传递变量。例如,我尝试了以下内容:

def display_pattern(n):
    spacing = 4
    format_string = f'>{spacing}' # this is '>4'
    temp = ''
    for i in range(1, n + 1):
        temp = f'{i:format_string}' + temp
        print(temp)

然而,我遇到了以下错误:

Traceback (most recent call last):
  File "pyramid.py", line 15, in <module>
    display_pattern(8)
  File "pyramid.py", line 9, in display_pattern
    temp = f'{i:format_string}' + temp
ValueError: Invalid format specifier

有没有办法让这段代码工作?主要问题在于能否使用变量控制间距以确定填充量。

2个回答

43

你应该将format_string作为变量放置

temp = f'{i:{format_string}}' + temp
:后的下一行代码直到您明确指示,它才会被解析为变量。 感谢@timpietzcker提供文档链接:格式化字符串字面量

6
您可以嵌套变量到一级:https://docs.python.org/3/whatsnew/3.6.html#pep-498-formatted-string-literals - Tim Pietzcker
是的,但是在 : 之后的下一行代码不会被解析为变量,除非您明确指示。 - Brown Bear
1
@bearbrown,感谢您提供详细的解释。这解决了我所有的疑虑。 - lmiguelvargasf

3

您需要将对齐和填充标记分开:

def display_pattern(n):
    padding = 4
    align = ">"
    temp = ''
    for i in range(1, n + 1):
        temp = f'{i:{align}{padding}}' + temp
        print(temp)

编辑:

我认为这并不完全正确。我进行了一些测试,以下内容同样有效:

def display_pattern(n):
    align = ">4"
    temp = ''
    for i in range(1, n + 1):
        temp = f'{i:{align}}' + temp
        print(temp)

因此,我无法确切地说你的方法为什么不能奏效...

为什么在这种情况下放置一个嵌套的{}是有效的?我的意思是{align}{padding}{}里面。 - lmiguelvargasf
2
我认为你不应该删除你的帖子,它帮助我找到了解决方案。 - Brown Bear

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接