【问题标题】:How does Python handle repr for strings?Python 如何处理字符串的 repr?
【发布时间】:2015-02-12 09:41:07
【问题描述】:

我正在尝试在 Java 中完全模拟 Python 的 repr;这包括在可能的情况下使用单引号。 Python 使用什么方法来确定它应该发出什么样的引号?

编辑:我正在寻找一些实际代码,位于 Python 网络中的某处。我已经查看了Objects/unicodeobject.c 和一些Objects/strlib/,但是除了Unicode 的转义序列之外我找不到任何东西。

【问题讨论】:

  • 为什么不看python源码?
  • 在我的终端上,repr 的输出似乎并没有随着用于创建字符串的引号类型而改变。 >>> repr("Hello") "'Hello'" >>> repr('Hello') "'Hello'"
  • @simonzack 我有。我已经从Objects/unicodeobject.c 中提取了我可以提取的内容。
  • @Smac89 它不存储报价信息,我从解释器那里得到了那么多。
  • @Smac89 我希望在 Java 中完全复制 repr 的行为。这包括引号。

标签: python repr


【解决方案1】:

我猜它会使用单引号,除非它需要在字符串中使用它。

如图:

print repr("Hello")
print repr('Hello')
print repr("Hell'o")
print repr('Hell"o')
print repr("""Hell'o Worl"o""")

输出:

'Hello'
'Hello'
"Hell'o" # only one using double quotes
'Hell"o'
'Hell\'o Worl"o' # handles the single quote with a \'

【讨论】:

  • 我实际上是在寻找一种算法或类似的源代码。我会更新问题。
  • @ıɯɐƃoʇǝızuǝʞ IMO 你的问题很清楚,但是一些stackoverflow用户根本没有阅读这个问题。
【解决方案2】:

从我可以从 Objects/byteobject.c (here) 中提取的内容中,这就是执行此操作的部分:

quote = '\'';
if (smartquotes && squotes && !dquotes)
    quote = '"';
if (squotes && quote == '\'') {
    if (newsize > PY_SSIZE_T_MAX - squotes)
        goto overflow;
    newsize += squotes;
}

所以,如果没有双引号而有单引号,则使用双引号,否则使用单引号。

【讨论】:

  • 是的.. 我认为这取决于您想要 ascii 字符串还是 unicode 字符串。 unicode_repr 中有类似的代码块。由于字符串在 python3 中默认为 unicode,因此 unicode 版本更可能是您想要的版本。
【解决方案3】:

https://github.com/python/cpython/tree/master/Objects/unicodeobject.c

static PyObject *
unicode_repr(PyObject *unicode)
{ ...

unicode_repr 在这里 github.com/python/cpython/blob/master/Objects/unicodeobject.c 看起来。

注意:我已更新此答案以删除过时信息并指向当前存储库

【讨论】:

  • 另外,最新的 3.4 源代码,我应该说。哦,好吧,这个非常过时的 git 镜像也可以工作。我也许能找到stringobject.c 消失的地方。
  • 从 python.org 获取源发行版。
  • (官方镜像为here)
  • 嗯..不是很明显.. PyObject_Repr 正在调用 res = (*v->ob_type->tp_repr)(v);我看不到明显是 unicode(或字符串)对象类型的东西。
  • 另外,我不是 C 人,所以这是我的半猜测工作。
猜你喜欢
  • 1970-01-01
  • 2019-08-19
  • 1970-01-01
  • 2019-03-22
  • 2016-12-28
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
相关资源
最近更新 更多