理解 Python 中的 repr() 函数

2024-12-12 08:41:00
admin
原创
147
摘要:问题描述: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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用