簡體   English   中英

我可以定義自己的格式規范嗎?

[英]Can I define my own format specification?

我想定義自己的str.format()規范,例如

def earmuffs(x):
    return "*"+str(x)+"*"

使用,例如,像這樣:

def triple2str(triple, fmt="g"):
    return "[{first:{fmt}} & {second:+{fmt}} | {third}]".format(
        first=triple[0], second=triple[1], third=triple[2], fmt=fmt)

以便:

## this works:
>>> triple2str((1,-2,3))
'[1 & -2 | 3]'
>>> triple2str((10000,200000,"z"),fmt=",d")
'[10,000 & +200,000 | z]'

## this does NOT work (I get `ValueError: Invalid conversion specification`)
>>> triple2str(("a","b","z"),fmt=earmuffs)
'[*a* & *b* | z]'

到目前為止,我能想到的最好的方法是

def triple2str(triple, fmt=str):
    return "[{first} & {second} | {third}]".format(
        first=fmt(triple[0]), second=fmt(triple[1]), third=triple[2])

像這樣工作:

>>> triple2str((1,-2,3))
'[1 & -2 | 3]'
>>> triple2str((10000,200000,"z"),fmt="{:,d}".format)
'[10,000 & 200,000 | z]' # no `+` before `2`!
>>> triple2str((10000,200000,"z"),fmt=earmuffs)
'[*10000* & *200000* | z]'

這真的是我能做的最好的嗎? 我不滿意的是,尚不清楚如何合並修飾符(例如,上面的+ )。

str.format是否可擴展?

str.format本身是不可擴展的。 但是,有兩種方法:


1。

使用您的自定義字符串格式化程序: https : //docs.python.org/2/library/string.html#custom-string-formatting

重寫format_field(obj, format_spec)方法以捕獲可調用的format_spec。 然后直接致電格式化程序。

此代碼段可以為您提供幫助(至少適用於py 3.5和2.7):

import string

class MyFormatter(string.Formatter):
    def __init__(self, *args, **kwargs):
        super(MyFormatter, self).__init__(*args, **kwargs)
        self.fns = {}

    def format_field(self, value, format_spec):
        # print(repr(value), repr(format_spec))

        # intercept {fmt} part with functions:
        if callable(value):
            result = super(MyFormatter, self).format_field(value, format_spec)
            self.fns[result] = value
            return result

        # intercept {var:{fmt}} with remembered {fmt}:
        if format_spec in self.fns:
            return self.fns[format_spec](value)
        else:
            return super(MyFormatter, self).format_field(value, format_spec)


def fn(val):
    return '*{}*'.format(val)


f = MyFormatter()
print(f.format("{var:{fmt}}", var=1000, fmt='g'))
print(f.format("{var:{fmt}}", var=1000, fmt=fn))

2。

定義每個對象的格式方法__format__(self, format_spec) ,其中format_spec是后面的內容:例如在{var:g} 您可以根據需要設置對象的自我表示格式。

但是,在您的情況下,對象是int / strs而不是自定義對象,因此此方法也無濟於事。


結論如下:

是的,您在問題中的解決方案已經足夠,而且可能是最簡單的解決方案。

在python 3中,您可以調用f-strings函數,也許這可以有所幫助。

def earmuffs(val):
    return "*{}*".format(val)

form = lambda a: f"method {earmuffs(a[0])} and method {earmuffs(a[1])}"

b = ('one', 'two')

form(b)
>>>'method *one* and method *two*'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM