理解 Python 中的 repr() 函数

2024-12-12 08:41:00
admin
原创
121
摘要:问题描述:repr():对象的可评估字符串表示形式(可以对其进行“eval()”,这意味着它是一个可评估为 Python 对象的字符串表示形式)换句话说:>>> x = 'foo' >>> repr(x) "'foo'" 问题:为什么我这样做时会出现双引...

问题描述:

repr():对象的可评估字符串表示形式(可以对其进行“eval()”,这意味着它是一个可评估为 Python 对象的字符串表示形式)

换句话说:

>>> x = 'foo'
>>> repr(x)
"'foo'"

问题:

  1. 为什么我这样做时会出现双引号repr(x)?(我这样做时没有得到它们str(x)

  2. 'foo'为什么我这样做时得到的eval("'foo'")不是对象 x ?


解决方案 1:

>>> x = 'foo'
>>> x
'foo'

因此名称x附加到'foo'字符串。例如,当您调用时,repr(x)解释器会放入'foo'x不是 然后调用repr('foo')

>>> repr(x)
"'foo'"
>>> x.__repr__()
"'foo'"

repr`__repr__实际上调用的魔术方法x,该方法给出包含赋值表示的字符串**。**因此它在字符串中返回。的想法是给出一个包含一系列符号的字符串,我们可以在解释器中输入这些符号并获取与作为 参数发送的相同值。'foo'x'foo'"""'foo'"reprrepr`

>>> eval("'foo'")
'foo'

当我们调用 时eval("'foo'"),就和我们在解释器中输入一样。就像我们直接在解释器中'foo'输入外部字符串的内容一样。""

>>> eval('foo')

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    eval('foo')
  File "<string>", line 1, in <module>
NameError: name 'foo' is not defined

如果我们调用eval('foo'),它和我们在解释器中输入的一样foo。但是没有foo可用的变量,并且会引发异常。

>>> str(x)
'foo'
>>> x.__str__()
'foo'
>>> 

str只是对象的字符串表示形式(记住,x变量指的是'foo'),所以此函数返回字符串。

>>> str(5)
'5'

整数的字符串表示形式5'5'

>>> str('foo')
'foo'

和字符串的字符串表示形式'foo'是相同的字符串'foo'

解决方案 2:

交互式解释器上获得的反馈repr也会使用。当您输入表达式(假设为expr)时,解释器基本上会执行result = expr; if result is not None: print repr(result)。因此,示例中的第二行将字符串格式化foo所需的表示形式('foo')。然后解释器创建该 的repr表示形式,并留下双引号。

为什么当我将 %r 与双引号和单引号转义结合起来并将它们打印出来时,它会按照我在 .py 文件中编写的方式打印出来,而不是按照我希望看到的方式打印出来?

我不确定你在这里问的是什么。文本single ' and double " quotes在运行 时repr包含一种引号的转义符。当然有,否则根据 Python 规则它就不是有效的字符串文字。这正是你通过调用 所要求的repr

还请注意,eval(repr(x)) == x类比不是字面意思。它是一种近似,适用于大多数(所有?)内置类型,但最重要的是,通过查看输出,您可以很好地了解类型和逻辑“值” repr

解决方案 3:

str()用于为最终用户创建输出,repr()用于在开发过程中进行调试。它是对象的官方表示。

例子:

>>> import datetime
>>> today = datetime.datetime.now()
>>> str(today)
'2018-04-08 18:00:15.178404'
>>> repr(today)
'datetime.datetime(2018, 4, 8, 18, 3, 21, 167886)'

从输出中我们看到repr()显示了日期对象的官方表示。

解决方案 4:

1) 的结果repr('foo')字符串 'foo'。在 Python shell 中,表达式的结果也表示为表示形式,因此您本质上看到的是repr(repr('foo'))

2)eval计算表达式的结果。结果始终是一个(例如数字、字符串或对象)。多个变量可以引用同一个值,例如:

x = 'foo'
y = x

x 和 y 现在指的是同一个值。

3) 我不明白你的意思。你能发个例子,说明一下你想看什么吗?

解决方案 5:

当你说

foo = 'bar'
baz(foo)

您没有传递foobaz函数。 foo只是一个用来表示值的名称,在本例中'bar',并且该值被传递给函数baz

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用