如何从格式字符串中调用对象的方法? (蟒蛇)

时间:2019-10-12 21:07:40

标签: python string

我想从模板字符串中调用字符串的Lower方法。理想情况下,看起来像

string = "Lowercase: {value.lower()}"

string.format(value=...)

但是,这给我一个错误,提示AttributeError: 'str' object has no attribute 'lower()'(我理解为什么会收到此错误)。

我想知道是否有办法实现这一目标。我一直在考虑使用转换(例如'{value!r}来调用repr),但这并不能解决我的问题。我可以创建一个自定义转换说明符吗?

(根据记录,string.format(value=value.lower())不一定适用于我。)

1 个答案:

答案 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!