是否强制str()和两个字符串文本来创建自定义字符串?

2024-09-27 00:19:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个'str'对象的子类,我需要将它应用到应用程序域。由于应用程序中充满了string literal和str()强制转换,因此需要很长时间才能将它们全部更改为自定义字符串类。我知道可以重写'str()',但我不确定字符串文字。在

我知道这不是一个好主意,但应用程序需要它。可以用Python实现吗?如果没有,是否需要我修改'stringlib,它是'str'对象的C实现?在

我还知道,修改解析器使应用程序运行被认为是一种非常糟糕的编程实践。这可以通过扩展而不是解析器修改来实现吗?在


Tags: 对象字符串程序运行应用程序解析器string编程子类
2条回答

不能修改内置类型,例如,不能在运行时添加新属性1

>>> setattr(str, "hello", lambda: "Hello custom str!")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't set attributes of built-in/extension type 'str'

我会尝试解析所有的文本字符串,并用自定义字符串子类的构造函数替换它们。这首先是:

  • 显式,这使您和其他人更容易记住,这个字符串是不同的。在

通常,i18n库有某种类型的字符串文本检测例程,在检测过程中可以派上用场。一旦这些字符串被收集起来,它或多或少只是替换。在


1这也是一个原因,python不如ruby灵活。你不能只编写测试库,即猴子修补核心类,并在运行时向每个对象添加^{}之类的方法。这里有一个有趣的技术讨论这些细微差别及其后果:http://blog.extracheese.org/2010/02/python-vs-ruby-a-battle-to-the-death.html

我遇到这个问题是因为我想做类似的事情-str.格式python中的行为>;=2.7使用python>;=2.4。stringformat(https://github.com/florentx/stringformat)中的FormattableString似乎是正确的做法,但它只有在我能够使它适用于文本时才有用。在

尽管有很多注释,但是使用我在这里找到的代码,monkey修补python中的内置代码和文本似乎是可能的:https://gist.github.com/295200。这似乎是阿明·罗纳彻写的,当然不是我写的。在

最后,我能够在Python2.6中做类似的事情,尽管它通常只在2.7中工作。在

dx = get_class_dict(str)
dx['format'] = lambda x,*args,**kargs: FormattableString(x).format(*args,**kargs)
print "We've monkey patched {}, {}".format('str', 'with multiple parameters')

上面链接中的示例显示了如何添加新方法而不是替换现有方法。在

这个小练习促使我将str和unicode monkey补丁添加到stringformat包中,现在您只需执行以下操作:

^{pr2}$

这可以从这里克隆:“https://github.com/igg/stringformat,直到/除非它被拉入“官方”stringformat。哈。我只有两个超链接,所以你没有点击!在

相关问题 更多 >

    热门问题