为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

凤凰求蛊 2022-06-22 15:39:19
我想从模板字符串中调用字符串的 lower 方法。理想情况下,这看起来像string = "Lowercase: {value.lower()}"string.format(value=...)但是,这给了我一个错误提示AttributeError: 'str' object has no attribute 'lower()'(我理解为什么会出现此错误)。我想知道是否有办法实现这一目标。我已经研究过使用转换(比如'{value!r}调用repr),但这并没有解决我的问题。我可以创建自定义转换说明符吗?(为了记录,string.format(value=value.lower())在我的情况下不一定有效。)
查看完整描述

1 回答

?
www说

TA贡献1775条经验 获得超8个赞

IIRC,格式规范迷你语言可以访问对象的属性,但不能调用方法。它假定您正在寻找名称为“lower()”的属性,包括括号。


value必须是字符串吗?也许您可以创建一个带有 a 的字符串子类,@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!


查看完整回答
反对 回复 2022-06-22
  • 1 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信