假设我们有一段错误的代码,它意外地覆盖了一些系统库的属性,就像这样:
import socket
socket.error = 'some other object'
有什么方法可以防止这种行为,或者找到负责这样做的代码吗?
我尝试从 socket.error 中创建一个属性,但没有成功:
def fget(self):
return socket.error
def fset(self, value):
raise SystemError('You cannot alter this attribute.')
# From now on, settings socket.error = x should raise an error
socket.error = property(fget, fset)
请您参考如下方法:
您可以(暂时)将其粘贴到您的代码中:
class Bridge(object):
def __init__(self, module):
self.__dict__['module'] = module
def __getattr__(self, attr):
return getattr(self.module, attr)
def __setattr__(self, attr, val):
raise TypeError('{a!r} can not be set'.format(a=attr))
import sys
import socket
socket = sys.modules['socket'] = Bridge(socket)
然后在 socket 上设置属性(至少以最常用的方式)会引发异常。回溯将使您能够定位错误。
print(socket.error)
setattr(socket, 'error', 'blah')
产量
% test.py
<class 'socket.error'>
Traceback (most recent call last):
File "/home/unutbu/pybin/test.py", line 15, in <module>
setattr(socket, 'error', 'blah')
File "/home/unutbu/pybin/test.py", line 10, in __setattr__
raise TypeError('{a!r} can not be set'.format(a=attr))
TypeError: 'error' can not be set
