【发布时间】:2009-05-12 03:20:08
【问题描述】:
在以下代码段中:
try:
raise Bob()
except Fred:
print "blah"
Bob 和 Fred 的比较是如何实现的?
从玩起来似乎在下面调用isinstance,这样对吗?
我问是因为我试图颠覆这个过程,特别是我希望能够构建一个 Bob 以便它被 execpt Fred 捕获,即使它实际上不是 Fred 或其任何子类的实例.
有几个人问我为什么要这样做......
我们有一个 RMI 系统,它是围绕使其尽可能无缝的理念构建的,这里有一个使用中的简单示例,注意 RMI 系统中没有特定于套接字的代码,套接字只是提供了一个方便的例子。
import remobj
socket = remobj.RemObj("remote_server_name").getImport("socket")
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(("", 0))
print "listening on port:", s.getsockname()[1]
s.settimeout(10)
try:
print "received:", s.recv(2048)
except socket.timeout:
print "timeout"
现在,在这个特定示例中,except 没有按预期工作,因为引发的对象不是 socket.timeout 的实例,它是我们的代理助手类之一的实例。
【问题讨论】:
-
你到底为什么要这么做?
-
-1:颠覆 Python 明显、明确的功能,故意混淆未来的维护者。