python 格式采用织物彩色字符串的实际长度

python format take the real length for fabric colored strings

我使用 python fabric 为终端输出着色,并使用字符串格式来对齐文本。

颜色向字符串添加不可见代码,如何不破坏格式化输出?

>>> from fabric.colors import red
>>> print '{:->27}'.format('line one')
-------------------line one
>>> print '{:->27}'.format('longer line two')
------------longer line two
>>> print '{:->27}'.format(red('line three'))
--------line three
>>>

正如汉斯所说,我们只需要加上+9

>>> 
>>> print '{:->27}'.format('line one')
-------------------line one
>>> print '{:->27}'.format('longer line two')
------------longer line two
>>> print '{:->36}'.format(red('line three'))
-----------------line three
>>> print '{:->36}'.format(red('and more words'))
-------------and more words
>>> print '{:->36}'.format(red('and more words plus one'))
----and more words plus one
>>>

由于 source code 的面料颜色包含此内容:

def _wrap_with(code):
    def inner(text, bold=False):
        c = code
        if bold:
            c = "1;%s" % c
        return "3[%sm%s3[0m" % (c, text)
    return inner

red = _wrap_with('31')

而你的 'line three' 输出一行比其他行短 9 个字符, 我猜 red(String) 的输出总是包含 9 个不可见字符,由字符串 "\033[%sm%s3[0m".

存储

所以要修正格式,当使用红色(String)时,您应该输入

print '{:->(27+9)}'.format(red('line three'))

而不是

print '{:->27}'.format(red('line three'))