用Python字符串格式填充单个空格()

时间:2017-03-12 08:55:22

标签: python string python-3.x formatting

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

这是我的例子:

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

# result
'Hi Jhon!'

现在一切正常,直到我的user var为空或假,在这种情况下,这是上面的结果

'Hi !'
#  ^ notice the empty space

相反,我想要'Hi!'作为结果。

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

我最终做了这样的事情:

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

以上工作正常,但我认为这有点像hackish,我现在想,如果有一种内置的方法可以做到这一点,我就错过了。

谢谢!

1 个答案:

答案 0 :(得分:1)

以下是我在评论中发布的解决方案:

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

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

来解决
p=bool(user) + len(user)

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

以下是一些演示各种解决方案的代码,包括一对使用文字字符串插值(即f-strings)的函数,这些函数在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