gpt4 book ai didi

python字符串插值

转载 作者:太空狗 更新时间:2023-10-29 17:29:56 26 4
gpt4 key购买 nike

什么会产生以下行为?

>>> print str(msg)
my message
>>> print unicode(msg)
my message

但是:

>>> print '%s' % msg
another message

更多信息:

  • 我的 msg 对象继承自 unicode
  • 方法 __str__/__unicode__/__repr__ 方法被覆盖以返回字符串 'my message'
  • msg 对象使用字符串 'another message' 初始化。
  • 这是在 python 2.5 上运行
  • 变量 msg 在测试之间没有改变
  • 这实际上是真正给出这些结果的真正的 doctest。

我想要一个与这个 doctest 相匹配的解决方案,并且大惊小怪(尤其是围绕实际继承):

>>> print '%s' % msg
my message

感谢所有建议。

我觉得这不会有更多帮助,但对于好奇的读者(和喜欢冒险的 pythonist)来说,这里是对象的实现:

class Message(zope.i18nmessageid.Message):

def __repr__(self):
return repr(zope.i18n.interpolate(self.default, self.mapping))

def __str__(self):
return zope.i18n.interpolate(self.default, self.mapping)

def __unicode__(self):
return zope.i18n.interpolate(self.default, self.mapping)

这就是我们创建对象 msg 的方式:

>>> msg = Message('another message', 'mydomain', default='my message')

Zope 包版本和使用的代码是:

编辑信息:

  • 添加/更新了被覆盖的方法的名称
  • 添加了更多信息(python 版本和次要信息)
  • 更新了一些错误的信息(`msg` 类是基于 `unicode` 类而不是 `basestring`)
  • 添加了所用类的实际实现

最佳答案

更新 2: 请在水平栏下方找到原始答案,包括展示 OP 描述的行为的类的简单示例。至于我在查询 Python 源代码 (v. 2.6.4) 的过程中能够推测的内容:

文件 Include/unicodeobject.h 包含以下行(我的(有点旧)结帐中的第 436-7 行):

#define PyUnicode_AS_UNICODE(op) \                                              
(((PyUnicodeObject *)(op))->str)

这在格式化代码中无处不在,据我所知,这意味着在字符串格式化期间,任何继承自 unicode 的对象都将被访问,以便它的unicode 字符串缓冲区可以直接使用,无需调用任何 Python 方法。就性能而言,这很好,我敢肯定(并且非常符合 Juergen 在对此答案的评论中的猜想)。

对于 OP 的问题,这可能意味着只有当像 Anurag Uniyal 的包装类想法这样的东西对于这个特定的用例来说是可以接受的时候,才有可能让事情按照 OP 希望的方式工作。如果不是,我现在唯一想到的就是将此类的对象包装在 str/unicode 中,无论它们被插入到字符串中......啊。 (我真诚地希望我只是缺少一个有人会在一分钟内指出的更清洁的解决方案!)


(更新:这是在 OP 包含他的类(class)代码之前大约一分钟发布的,但无论如何我还是把它留在这里 (1) 以进行以下解释的猜想/初步尝试代码,(2) 作为一个如何产生这种行为的简单示例(Anurag Uniyal 此后提供了另一个直接调用 unicode 构造函数的代码,而不是通过 super ), (3) 希望以后能够编辑某些内容以帮助 OP 获得所需的行为。)

这是一个类的示例,它实际上像 OP 描述的那样工作(Python 2.6.4,它确实产生弃用警告 -- /usr/bin/ipython:3: DeprecationWarning: object.__init__()不带参数):

class Foo(unicode):
def __init__(self, msg):
super(unicode, self).__init__(msg)
def __str__(self): return 'str msg'
def __repr__(self): return 'repr msg'
def __unicode__(self): return u'unicode msg'

IPython 中的几个交互:

In [12]: print(Foo("asdf"))
asdf

In [13]: str(Foo("asdf"))
Out[13]: 'str msg'

In [14]: print str(Foo("asdf"))
-------> print(str(Foo("asdf")))
str msg

In [15]: print(str(Foo("asdf")))
str msg

In [16]: print('%s' % Foo("asdf"))
asdf

显然,字符串插值将此对象视为 unicode 的实例(直接调用 __str__unicode 实现),而其他函数将它作为 Foo 的实例。这在内部是如何发生的,为什么会这样,是错误还是功能,我真的不知道。

至于如何修复 OP 的对象...好吧,我不看它的代码怎么知道???给我代码,我保证会考虑一下! 好的,我正在考虑...目前还没有想法。

关于python字符串插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2311906/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com