为什么Python没有隐式转换?

6

与C++或Java不同,当我有像print "Hello " + 1这样的内容时,会出现错误,提示无法将strint对象拼接。为什么Python不会自动做这种转换呢?


3
哪个应该转换?你的 str 还是你的 int?“显式优于隐式”... - Pierre GM
如果我正在“打印”它们,那么所有的内容都应该转换为“str”,对吗?或者如果我将连接赋值给一个str对象,那么所有的内容也应该是“str”。 - Cemre Mengü
5
所有这些变量最终都应该转换为str类型,但在打印之前的行为并不容易推断。如果我说print '4' + 2,我应该得到6还是42print 4 + '2'呢? - Silas Ray
在C++中,隐式转换允许您执行上述操作,结果将打印出一个字符串"Hello1"。Python仅对数字执行隐式转换(您可以将长整型乘以双精度型而无需重新转换)。这就是Python的本质。 - jornak
@sr2222 是的,那是个好观点,我想。 - Cemre Mengü
显示剩余3条评论
1个回答

8
print "Hello", 1

字符串拼接不起作用的原因是字符串对象内部没有代码来执行类型转换,这也是它们在__add__()方法中无法执行的原因。至于为什么会这样,可能是因为Guido认为这样做不太好。 Python之禅说:“显式优于隐式”。

但是,您可以编写一个字符串子类来实现这种方式:

class MagicStr(str):
    def __add__(self, other):
        return MagicStr(str(self) + str(other))
    def __radd__(self, other):
        return MagicStr(str(other) + str(self))
    __iadd__ = __add__

当然,无法让Python使用该类来处理字符串字面值或用户输入,因此您最终不得不不断进行字符串转换:

 MagicStr("Hello") + 1

在这时候,你不妨直接写成:“”。
 "Hello" + str(1)

我想知道你是否可以monkeypatch String.__add__而不是添加自己的类,以获得所需的效果。 - Dobes Vandermeer
不可以。你不能修改 str - kindall
@kindall 这并不完全正确,有一种名为“禁果包”的软件包可以向 C 语言对象添加新的属性和方法。 - justanr
虽然它这么说,但我从未成功使用过它。 :-) - kindall
@kindall 你可以重新分配str..但这只会让事情变得混乱,当调用str时出现错误,但仍然获得type("dude") - Huge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接