为什么不调用类型对象上的repr按预期工作?

时间:2016-02-24 12:17:02

标签: python-3.x

首先,我要说我同意eval(repr(some_string))可能是一个坏主意。但这是一个存在的东西,我有一个特定的问题。

为什么这不起作用?

my_type = int 
my_type_str = repr(int)  
my_type_from_str = eval(my_type_str)

为了澄清,我特别知道eval呼叫失败的原因。命令repr(int)生成一个无法自动解释的字符串。我想我的问题是,这并不像期望的那样......所以我的期望是错误的实施是错误的。这是什么?

旁注

有一些技巧可以用来解决这个默认行为,有些是显而易见的,有些则没有。例如,这个:

my_type = int 
my_type_str = my_type.__name__
my_type_from_str = eval(my_type_str)
assert my_type is my_type_from_str 

这引发了我的&#34; hack&#34;警告硬核,我不喜欢它(或其他类似的黑客,例如使用一些自制函数解析字符串"<class 'int'>"。)

1 个答案:

答案 0 :(得分:2)

The documentation解释说:

  

返回包含对象的可打印表示的字符串。 对于许多类型,此函数尝试返回一个字符串,该字符串在传递给eval() 时会产生具有相同值的对象,否则表示形式是包含在尖括号中的字符串,其中包含对象类型的名称以及通常包括对象的名称和地址的附加信息。类可以通过定义 repr ()方法来控制此函数为其实例返回的内容。

(强调我的)

所以,它并没有说repr必须总是返回有效的Python代码 - 有时情况并非如此。只是另一个不依赖它的论据。