假設我們有一個有錯誤的一段代碼意外地覆蓋一些系統庫的屬性,就像這樣:如何避免在Python中覆蓋系統庫的屬性?
import socket
socket.error = 'some other object'
有什麼辦法來防止這種行爲,或找負責做的代碼?
我試圖使一個地產出socket.error的,但沒有奏效:在
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)
然後設置屬性:
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)
你能不能用grep的調皮線? '$ grep -r'socket.error ='*' – danodonovan 2013-03-18 16:51:51
真的,這在生產代碼中很少發生。當它發生時,你會很快發現它,並且grep是你的朋友。 – 2013-03-18 16:52:34
grep沒有找到任何東西。淘氣的線路可能就像'襪子的導入插座; x ='錯誤'; setattr(sock,x,'其他對象')' – 2013-03-18 16:53:33