Python 个对象的 属性 是否有一个名称,以具有与其代码等效的控制台表示形式?

Is there a name for the property of Python objects to have a console representation equivalent to their code?

这是一个宽泛的话题,但我会尝试将其分解为一些具体问题。

我在考虑 ~meta~ 属性 in Python 其中许多基本数据类型的控制台表示等同于用于的代码构建那些对象:

l = [1,2,3]
d = {'a':1,'b':2,'c':3}
s = {1,2,3}
t = (1,2,3)
g = "123"

###

>>> l
[1, 2, 3]
>>> d
{'a': 1, 'b': 2, 'c': 3}
>>> s
{1, 2, 3}
>>> t
(1, 2, 3)
>>> g
'123'

因此,对于这些对象中的任何一个,我都可以将控制台输出复制到代码中以创建这些结构或将它们分配给变量。

这不适用于某些对象,例如函数:

def foo():
    pass

f = foo
L = [1,2,3, foo]

###

>>> f
<function foo at 0x00000235950347B8>
>>> L
[1, 2, 3, <function foo at 0x00000235950347B8>]

虽然上面的列表 l 有这个 属性,但这里的列表 L 没有;但这似乎只有 b/c L 包含一个不包含此 属性 的元素。所以在我看来,一般来说,list 在某种程度上有这个 属性。

这也适用于非标准库中的某些对象:

import numpy as np
a = np.array([1,2,3])

import pandas as pd
dr = pd.date_range('01-01-2020','01-02-2020', freq='3H')

###

>>> a
array([1, 2, 3])
>>> dr
DatetimeIndex(['2020-01-01 00:00:00', '2020-01-01 03:00:00',
               '2020-01-01 06:00:00', '2020-01-01 09:00:00',
               '2020-01-01 12:00:00', '2020-01-01 15:00:00',
               '2020-01-01 18:00:00', '2020-01-01 21:00:00',
               '2020-01-02 00:00:00'],
              dtype='datetime64[ns]', freq='3H')

对于 numpy 数组,控制台输出与使用的代码匹配,前提是命名空间中有 array。对于 pandas.date_range,它有点不同,因为控制台输出可以构造由 dr = pd.date_range('01-01-2020','01-02-2020', freq='3H') 创建的相同对象,但代码不同。

有趣的例子

A DataFrame 不包含此 属性, 但是 使用 to_dict() 方法 将其转换为确实包含此 属性:

的结构
import pandas as pd
df = pd.DataFrame({'A':[1,2,3],
                   'B':[4,5,6]})

###

>>> df
   A  B
0  1  4
1  2  5
2  3  6
>>> df.to_dict()
{'A': {0: 1, 1: 2, 2: 3}, 'B': {0: 4, 1: 5, 2: 6}}
>>> pd.DataFrame.from_dict({'A': {0: 1, 1: 2, 2: 3}, 'B': {0: 4, 1: 5, 2: 6}})
   A  B
0  1  4
1  2  5
2  3  6

一个有用的示例场景是.....在 SO 上发布! B/c 您可以将 DataFrame 转换为数据结构,其中文本表示可用于构造该数据结构。因此,如果您与某人共享 to_dict() 版本的 DataFrame,他们将获得 Python-语法代码,可用于重新创建结构。我发现这在某些情况下优于 pd.read_clipboard()


我基于以上的问题:

主要是:

另外(这些不太具体,我知道,如果偏离主题可以删除):

如果这是大家的常识,或者我在这里小题大作,我深表歉意!

对象的控制台表示是什么,取决于其 __repr__() 方法的编写方式。所以我想如果你把这个“属性”说成对象的repr,我想我们大多数人至少会理解。该方法必须 return 一个字符串,但是字符串的内容由作者决定,所以一般来说不可能说一个对象的 repr 是否与创建它所需的代码相同。在某些情况下(例如函数),代码可能太长而无用。在其他(例如递归结构)中可能没有合理的线性表示。

作为回答而不是评论重新发布以回应参与者在评论线程中的建议。

我碰巧看到了一些与此相关的信息(一年半后)。 this article 中一段有趣的段落断言:

The default objective of __repr__ is to have a string representation of the object from which object can be formed again using Python’s eval such that below holds true: object = eval(repr(object))

object == eval(repr(object)) (!!!)

在 Python 代码中,这巧妙地说明了我所掌握的概念。可以从其控制台表示构造对象。

从谷歌搜索 Python 短语,我发现了更多 Stack 资源,包括 canonical post on the difference between __str__ and __repr__. But particularly relevant here was this answer which highlights how this concept is discussed in the Python documentation for __repr__ 特别是,有建议:

If at all possible, this should look like a valid Python expression that could be used to recreate an object with the same value (given an appropriate environment).

此外,对象的 __repr__ 应该是 清楚的 明确的 这样,如果您检查对象,你确切地知道是什么。 object == eval(repr(object)) 是实现这一目标的一种方式。

关于我最初的问题:

  • 这个“属性”有名字吗? 没有,但是 object == eval(repr(object)) 是一种简洁的表述方式。 Python 文档有自己的表述方式。
  • 它是 Python 独有的东西还是在其他语言中也适用? 我真的不知道它是否独一无二,但它肯定是鼓励部分Python!但它的主要目的是为了 developing/unambiguity,而不是 sharing/reproducing 代码。