首先,我要说我同意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'>"
。)
答案 0 :(得分:2)
返回包含对象的可打印表示的字符串。 对于许多类型,此函数尝试返回一个字符串,该字符串在传递给
eval()
时会产生具有相同值的对象,否则表示形式是包含在尖括号中的字符串,其中包含对象类型的名称以及通常包括对象的名称和地址的附加信息。类可以通过定义 repr ()方法来控制此函数为其实例返回的内容。
(强调我的)
所以,它并没有说repr
必须总是返回有效的Python代码 - 有时情况并非如此。只是另一个不依赖它的论据。