Skip to main content
 首页 » 编程设计

python之如何避免覆盖 Python 中系统库的属性

2025年05月04日17Free-Thinker

假设我们有一段错误的代码,它意外地覆盖了一些系统库的属性,就像这样:

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