我想从模板字符串中调用字符串的Lower方法。理想情况下,看起来像
string = "Lowercase: {value.lower()}"
string.format(value=...)
但是,这给我一个错误,提示AttributeError: 'str' object has no attribute 'lower()'
(我理解为什么会收到此错误)。
我想知道是否有办法实现这一目标。我一直在考虑使用转换(例如'{value!r}
来调用repr
),但这并不能解决我的问题。我可以创建一个自定义转换说明符吗?
(根据记录,string.format(value=value.lower())
不一定适用于我。)
答案 0 :(得分:2)
IIRC,格式规范迷你语言可以访问对象的属性,但是不能调用方法。假定您正在寻找名称为“ lower()”(包括括号)的属性。
value
是否必须是字符串?也许您可以创建一个带有@property
的字符串子类,该子类返回自身的小写版本。例如:
class StringEx(str):
@property
def lowercase(self):
return self.lower()
x = StringEx("Hello, World!")
s = "Lowercase: {value.lowercase}"
print(s.format(value=x))
结果:
Lowercase: hello, world!
如果您期望有很多不同格式的字符串,并且不想为每个字符串方法实现一个属性,则可以通过覆盖__getattr__
来一次性覆盖所有零参数方法:>
class StringEx(str):
def __getattr__(self, name):
if name.endswith("()"):
return getattr(self, name[:-2])()
else:
raise AttributeError
x = StringEx("HeLlO, WoRlD!")
format_strings = [
"Regular: {value}",
"Lowercase: {value.lower()}",
"Uppercase: {value.upper()}",
"Title: {value.title()}"
]
for s in format_strings:
print(s.format(value=x))
结果:
Regular: HeLlO, WoRlD!
Lowercase: hello, world!
Uppercase: HELLO, WORLD!
Title: Hello, World!