1

次のように、システム ライブラリの属性を誤ってオーバーライドするバグのあるコードがあるとします。

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)
4

1 に答える 1

6

これを(一時的に)コードに貼り付けることができます:

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
于 2013-03-18T17:01:03.367 に答える