【问题标题】:Padding with single space in Python string format()以 Python 字符串格式填充单个空格()
【发布时间】:2017-03-12 08:55:22
【问题描述】:

恐怕这是一个基本的 Python 问题,但我找不到正确的答案。 我想在占位符前面添加一个填充空间。

这是我的例子:

user = 'Jhon'
'Hi {u}!'.format(u=user if user else '')

# result
'Hi Jhon!'

现在一切都很好,直到我的user var 为空或为 false,在这种情况下,这就是上面的结果

'Hi !'
#  ^ notice the empty space

结果我想要'Hi!'

现在我尝试使用 format() 填充选项,例如 {:>1},但 ofc 不起作用,因为它会添加足够的填充以达到 1 的字符长度。

我最终做了这样的事情:

'Hi{u:>{p}}!'.format(u=user if user else '', p=1+len(user))

以上工作正常,但我认为这有点骇人听闻,如果有一种我缺少的内置方法,我想现在这样做。

谢谢!

【问题讨论】:

  • 避免问题:'Hi {u}!'.format(u=user) if user else 'Hi!' - 易于阅读且灵活。
  • 'Hi{u}!'.format(u=' ' + user if user else '') 怎么样?
  • 你们俩确实是对的,@Ryan 的建议看起来既快速又清晰,但不幸的是,在我的情况下我无法使用它(示例字符串是一个简化的简化案例,以显示我的问题)。
  • 如果@PM2Ring 将他的建议作为答案发布,我会将其标记为解决方案

标签: python string python-3.x formatting


【解决方案1】:

这是我在 cmets 中发布的解决方案:

'Hi{u}!'.format(u=' ' + user if user else '')

您在问题中发布的解决方案不太有效,但可以通过将填充长度计算更改为来修复它

p=bool(user) + len(user)

bool 函数确定它的参数是 True-ish 还是 False-ish,并分别返回 TrueFalse。但是TrueFalse 可用于算术运算,它们的计算结果分别为 1 和 0。

这里有一些代码演示了各种解决方案,包括一些使用文字字符串插值(也称为 f 字符串)的代码,它们在 Python 3.6+ 中可用。

for user in ('John', ''):
    print('user is {!r}'.format(user)) 
    # Gruber
    print('Hi{u:>{p}}!'.format(u=user if user else '', p=1+len(user)))
    # Gruber, fixed
    print('Hi{u:>{p}}!'.format(u=user if user else '', p=bool(user) + len(user)))
    # Ryan
    print('Hi {u}!'.format(u=user) if user else 'Hi!')
    # PM 2Ring
    print('Hi{u}!'.format(u=' ' + user if user else ''))
    print('Hi{p}{u}!'.format(u=user, p=' ' if user else ''))
    # Python 3.6
    print(f'Hi{user and " " or ""}{user}!')
    print(f'Hi{" " if user else ""}{user}!')
    # Old `%-style` interpolation
    print('Hi%s%s!' % (user and " " or "", user))

    print()

输出

user is 'John'
Hi John!
Hi John!
Hi John!
Hi John!
Hi John!
Hi John!
Hi John!
Hi John!

user is ''
Hi !
Hi!
Hi!
Hi!
Hi!
Hi!
Hi!
Hi!

有关 f 字符串的信息,请参阅 Python 官方文档中的 Formatted string literals。另请参阅 PEP 498 -- Literal String InterpolationPEP 536 -- Final Grammar for Literal String Interpolation

【讨论】:

  • 感谢您非常详细的解释,而那个漂亮的f-string 不知道!有兴趣的可以看看thisthis
  • @Gruber f-strings 很棒。我通常不会在我的 SO 答案中使用它们,因为不是每个人都安装了 3.6(我去年五月安装了 alpha 版本)。但我想我应该在我的答案中添加一些链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 2015-06-04
  • 2023-03-30
  • 2021-05-20
  • 1970-01-01
  • 2015-10-13
相关资源
最近更新 更多