4

定期的に、Pythonで完全に空のオブジェクトを作成したいと思います。基本的に、キーが属性であるディクテーションが必要です。Python 2.xでは、次のような古いスタイルの型を作成できます。

class Empty: pass

__doc__これにより、2つの属性(および)のみを持つタイプが作成されます__module__。Python 3.xでは、すべてが新しいスタイルのクラスであるため、18個の属性を取得します。

私の現在の状況では、単体テスト内でモンキーパッチを適用する必要があるタイプを指定できるクラスがあります。パッチが適用されると、モックアウトされた各タイプの名前を持つ属性を持つタイプを作成しています。これは、私の現在の実装が行っていることとほぼ同じです。

class EmptyType: pass
...
mocks = EmptyType()
for mock_name, mock in patches:
    setattr(mocks, mock_name, mock)

EmptyType私の懸念は、誰かがプライベートメンバーをモックしている場合、オブジェクト内の名前との名前の衝突に遭遇する可能性があることです。そのため、属性をできるだけ少なくしたいと思いますEmptyType。そして、特に名前が有効な識別子でなければならないことがわかっている場合mocks.find_usersは、言うよりも言うのがはるかに簡単です。mocks["find_users"]

今のところ、デフォルトの名前以外に、モックに異なる名前を付ける機能を提供しています。それでも、そもそも混乱を招くエラーを回避するのは良いことです。JavaScriptでほとんど空の型を作成するのは非常に簡単で、Pythonにも似たようなものがあることを望んでいました。なぜなら、それらの良い使い方を見つけ続けているからです。

4

1 に答える 1

6

独自のカスタム コンテナを作成するのはどうですか?

class Empty(object):

    def __init__(self, **kwargs):
        object.__setattr__(self, '_obj', kwargs)

    def __getattribute__(self, name):
        obj = object.__getattribute__(self, '_obj')
        try:
            return obj[name]
        except KeyError:
            cls_name = object.__getattribute__(self, '__class__').__name__
            raise AttributeError(
                "'%(cls_name)s' object has no attribute '%(name)s'" % locals())

    def __setattr__(self, name, val):
        obj = object.__getattribute__(self, '_obj')
        obj[name] = val

    def __getitem__(self, key):
        return getattr(self, key)

    def __setitem__(self, key, val):
        return setattr(self, key, val)

使用法:

e = Empty(initial='optional-value')
e.initial
# 'optional-value'
e.val = 'foo'
e.val
# 'foo'
e.bad
# AttributeError: 'Empty' object has no attribute 'bad'
setattr(e, 'user', 'jdi')
e.user
# 'jdi'
e['user']
# 'jdi'

# note that you dont even see anything when you dir()
dir(e)
# []

# and trying to access _obj is protected
e._obj
#AttributeError: 'Empty' object has no attribute '_obj'

# But you could even set your own _obj attribute
e._obj = 1
e._obj
# 1

すべてをディクショナリの下に保存する_objため、基本的に、実際のインスタンス属性と競合しないクリーンなスペースが得られます。

于 2012-08-17T01:38:05.387 に答える