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

时间:2011-02-13 12:36:33

标签: python

我有一个' str '对象的子类,我需要将它应用到应用程序域。由于应用程序充满了字符串文字和str()强制转换,因此将所有这些变为自定义字符串类需要很长时间。我知道可以覆盖'str()',但我不确定字符串文字。

我知道这不是一个好主意,但应用程序需要它。是否可以在Python中执行此操作?如果没有,是否需要我修改“ strl ”对象的“ stringlib ”?

我也意识到修改解析器以使应用程序运行被认为是一种非常糟糕的编程习惯。这可以通过扩展而不是解析器修改来实现吗?

2 个答案:

答案 0 :(得分:1)

您无法修改内置类型,例如您无法在运行时添加新属性 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库有一些代码的字符串文字检测例程,在检测过程中可以派上用场。收集这些字符串后,它或多或少只是 replace


1 这也是一个原因,python不如ruby灵活。您不仅可以编写测试库,还可以编写核心类,并将should_equal等方法添加到运行时中的每个对象。这是一个有趣的技术谈论这些细微差别及其后果:http://blog.extracheese.org/2010/02/python-vs-ruby-a-battle-to-the-death.html

答案 1 :(得分:1)

我遇到了这个问题,因为我试图做类似的事情 - 来自python&gt; = 2.7的str.format行为在python&gt; = 2.4上工作。来自stringformat(https://github.com/florentx/stringformat)的FormattableString看起来是正确的,但它只有在我能够使用文字时才有用。

尽管有大多数评论,但使用我在此处找到的代码https://gist.github.com/295200似乎可以在python中使用猴子修补内置文件和文字。这似乎是由Armin Ronacher写的 - 当然不是我。

最后,我能够在python 2.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包中,所以现在你可以这样做:

# should work on python down to 2.4
import stringformat
print "[{0:{width}.{precision}s}]".format('hello world', width=8, precision=5)

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