![](/img/trans.png)
[英]How can I define my own scoring strategy sklearn.model_selection.GridSearchCV?
[英]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.