我编写了一个自定义
str
类,因为我想要一个 casefold()
方法来替换德语和斯堪的纳维亚变音符号(ä、å、ö、ø、ü...)。它继承自标准 str
类,并在使用它后取代 casefold()
方法。
class str(str):
def casefold(self):
umlauts: dict ={
'ä': 'ae',
'ö': 'oe',
'ü': 'ue',
'œ': 'oe',
'ø': 'oe',
'æ': 'ae',
'å': 'aa',
}
string_ = self.__repr__().casefold()
for letter in string_:
if letter in umlauts:
string_ = string_.replace(letter, umlauts[letter])
return string_
如果我使用
str()
来实例化一个字符串,它工作得很好:
str('äåöøü').casefold()
"'aeaaoeoeue'"
但是当我用
''
实例化时,使用标准 str
类。
'äåöøüß'.casefold()
'äåöøüss'
type(str('äåöøü'))
<class '__main__.str'>
type('äåöøüß')
<class 'str'>
有没有办法改变这一点,将
''
的实例化更改为自定义类?我找不到任何关于此的信息。
它不在当前的 Python(最高 3.13)中 - 语言文字只会创建标准内置类的实例。
通过摆弄导入机制和 AST,实际上将可以做类似的事情 - 但这不是常态,这将是一个复杂的代码,最重要的是,一个人查看包含以下内容的源文件待定制的实例化文字字符串不会知道这一点(但对于周围的注释)。该行为取决于安装自定义导入程序的代码,该代码在包含自定义字符串的任何源文件之前运行 -
TL;DR:虽然可行,但我不推荐这样做 - 相反,您可以使用单字母别名导入一个类,然后在字符串文字周围添加一个
L('')
。 (我通常对想要缩进的多行字符串执行此操作,例如 from textwrap import dedent as D
。
综上所述,请关注 PEP 750 - 模板字符串 - 它正在积极讨论中,并且可能会在未来几年成为该语言的强大新功能。如果获得批准,它将允许对引号字符使用自定义前缀,它们可以实例化您的 str 子类,并增加更多灵活性。
关于 PEP 的讨论在这里活跃 - https://discuss.python.org/t/pep-750-tag-strings-for-writing-domain-specific-languages/60408/39