cymel.pyutils.immutables

簡易的なイミュータブル化ラッパー。

Classes:

ImmutableDict

イミュータブル dict

Exceptions:

CymelImmutableError

immutable ラップされたオブジェクトが書き換えられた。

Functions:

immutable(type_or_obj, *args, **kwargs)

オブジェクトが変更不可になるラッパーを生成する。

immutableType(cls[, name, module])

オブジェクトが変更不可になるラッパークラスを生成する。

Constants:

cymel.pyutils.immutables.OPTIONAL_MUTATOR_DICT = {<class 'list'>: ('append', 'extend', 'insert'), <class 'dict'>: ('clear', 'pop', 'popitem', 'setdefault', 'update'), <class 'set'>: ('update', 'intersection_update', 'difference_update', 'symmetric_difference_update', 'add', 'remove', 'discard', 'pop', 'clear'), <class 'OpenMaya.MVector'>: ('normalize',), <class 'maya.OpenMaya.MVector'>: ('normalize',), <class 'OpenMaya.MPoint'>: ('cartesianize', 'rationalize', 'homogenize'), <class 'maya.OpenMaya.MPoint'>: ('cartesianize', 'rationalize', 'homogenize'), <class 'OpenMaya.MEulerRotation'>: ('boundIt', 'incrementalRotateBy', 'invertIt', 'reorderIt', 'setToAlternateSolution', 'setToClosestCut', 'setToClosestSolution', 'setValue'), <class 'maya.OpenMaya.MEulerRotation'>: ('boundIt', 'incrementalRotateBy', 'invertIt', 'reorderIt', 'setToAlternateSolution', 'setToClosestCut', 'setToClosestSolution', 'setValue'), <class 'OpenMaya.MQuaternion'>: ('conjugateIt', 'invertIt', 'negateIt', 'normalizeIt', 'setToXAxis', 'setToYAxis', 'setToZAxis', 'setValue'), <class 'maya.OpenMaya.MQuaternion'>: ['conjugateIt', 'invertIt', 'negateIt', 'normalizeIt', 'setToXAxis', 'setToYAxis', 'setToZAxis'], <class 'OpenMaya.MMatrix'>: ('setElement', 'setToIdentity', 'setToProduct'), <class 'maya.OpenMaya.MMatrix'>: ['setToIdentity', 'setToProduct'], <class 'cymel.core.datatypes.vector.Vector'>: ('set', 'normalize', 'normalizeIt', 'cartesianize', 'rationalize', 'homogenize', 'iabs', 'ineg', 'iadd', 'isub', 'imul', 'idiv', 'orthogonalize'), <class 'cymel.core.datatypes.boundingbox.BoundingBox'>: ('clear', 'transformUsing', 'expand'), <class 'cymel.core.datatypes.eulerrotation.EulerRotation'>: ('set', 'setValue', 'incrementalRotateBy', 'invertIt', 'reorderIt', 'boundIt', 'setToAlternateSolution', 'setToClosestSolution', 'setToClosestCut', 'setToReverseDirection'), <class 'cymel.core.datatypes.matrix.Matrix'>: ('set', 'setRow', 'setRows', 'setColumn', 'setColumns', 'setAxis', 'setAxes', 'imulidivsetTranslation', 'setT', 'addTranslation', 'addT', 'subTranslation', 'subT', 'mirrorIt', 'setToIdentity', 'init3x3', 'initTranslation', 'initT', 'setElem', 'transposeIt', 'invertIt', 'adjugateIt', 'adjointIt', 'homogenizeIt', 'orthonormalizeIt'), <class 'cymel.core.datatypes.quaternion.Quaternion'>: ('set', 'setValue', 'setToIdentity', 'setToXAxis', 'setToYAxis', 'setToZAxis', 'setAngle', 'conjugateIt', 'invertIt', 'normalize', 'normalizeIt', 'negateIt'), <class 'cymel.core.datatypes.transformation.Transformation'>: ('clear',)}

クラスごとの追加ミューテーターを把握するための辞書。適切なメンテナンスが必要。

Exceptions Details:

exception cymel.pyutils.immutables.CymelImmutableError

immutable ラップされたオブジェクトが書き換えられた。

Functions Details:

cymel.pyutils.immutables.immutable(type_or_obj, *args, **kwargs)

オブジェクトが変更不可になるラッパーを生成する。

immutableType を呼び出し、 デフォルト設定でラッパークラスを得て、 それでラップした新規インスタンスが返される。

パラメータ:
  • type_or_obj -- ラップするオブジェクトのクラス、又はインスタンス。 旧スタイルのクラスは非サポート。 インスタンスが指定された場合のラッパーの初期化引数は インスタンス自身となる為、コピーコンストラクタが実装 されている場合にのみ動作する。

  • args (list) -- type_or_obj にクラスが指定された場合の初期化引数。

  • kwargs (dict) -- type_or_obj にクラスが指定された場合の初期化引数。

戻り値:

ラッパーオブジェクト。

>>> import cymel.main as cm
>>> d = cm.immutable(dict, woo=1, foo=2, boo=3)  # construct a immutable dict.
>>> d = cm.immutable({'woo':1, 'foo':2, 'boo':3})  # same result via copying.
>>> d['foo']
2
>>> # d['foo'] = 9   # CymelImmutableError
>>> isinstance(d, dict)
True
>>> d.__class__ is dict
False
>>> cm.immutable({}).__class__ is d.__class__
True
cymel.pyutils.immutables.immutableType(cls, name=None, module=None)

オブジェクトが変更不可になるラッパークラスを生成する。

ラッパークラスはそのクラス名とともにキャッシュされ再利用される。

型ごとに初めて生成されたラッパークラスは、型のみをキーとしてもキャッシュされ、 クラス名が省略された場合には任意の名前としても再利用される。

ラッパークラスでは、オブジェクトの属性値を書き換える メソッドがオーバーライドされ、それらがコールされた際に CymelImmutableError が送出されるようになる。

どのメソッドをオーバーライドすべきかは、特殊メソッドの 有無を検査する事で自動決定されるが、 それだけでは補い切れないクラスに関しては OPTIONAL_MUTATOR_DICT 辞書で管理している為、 必要に応じて拡張しなければならない。

パラメータ:
  • cls (type) -- イミュータブル化する元のクラス。

  • name (str) -- ラッパークラスの名前。 省略時は 'Immutable元のクラス名' となる。

  • module (str) -- ラッパークラスを提供するモジュール名。 __module__ 属性にセットされる。 省略時は、元のクラスの __module__ 属性を引き継ぐ。

戻り値の型:

type

警告

name も module も省略した場合は、 指定したクラスで最初に生成された immutable ラッパークラスが 再利用されるため、結果的にどちらも不定となる。

注釈

OPTIONAL_MUTATOR_DICT には、インスタンスを変更する メソッド名をクラスごとに列挙する必要がある。 これは、対応させたいクラスごとに拡張する必要がある事を 意味する。ただし、全てのメソッドについて列挙する必要が あるわけではない。 OPTIONAL_MUTATOR_DICT をあえて拡張せずとも、 属性の設定、削除、代入演算子などはデフォルトで封じられる。 あえてメソッド名を列挙する必要があるのは以下のケースである。

  • 属性のメソッドを呼び出すメソッド。

  • 組み込みやバイナリモジュールで提供される型のメソッド。