cymel.pyutils.immutables¶
簡易的なイミュータブル化ラッパー。
Classes:
イミュータブル |
Exceptions:
|
Functions:
|
オブジェクトが変更不可になるラッパーを生成する。 |
|
オブジェクトが変更不可になるラッパークラスを生成する。 |
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:
Functions Details:
- cymel.pyutils.immutables.immutable(type_or_obj, *args, **kwargs)¶
オブジェクトが変更不可になるラッパーを生成する。
immutableType
を呼び出し、 デフォルト設定でラッパークラスを得て、 それでラップした新規インスタンスが返される。- パラメータ:
- 戻り値:
ラッパーオブジェクト。
>>> 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
辞書で管理している為、 必要に応じて拡張しなければならない。- パラメータ:
- 戻り値の型:
警告
name も module も省略した場合は、 指定したクラスで最初に生成された immutable ラッパークラスが 再利用されるため、結果的にどちらも不定となる。
注釈
OPTIONAL_MUTATOR_DICT
には、インスタンスを変更する メソッド名をクラスごとに列挙する必要がある。 これは、対応させたいクラスごとに拡張する必要がある事を 意味する。ただし、全てのメソッドについて列挙する必要が あるわけではない。OPTIONAL_MUTATOR_DICT
をあえて拡張せずとも、 属性の設定、削除、代入演算子などはデフォルトで封じられる。 あえてメソッド名を列挙する必要があるのは以下のケースである。属性のメソッドを呼び出すメソッド。
組み込みやバイナリモジュールで提供される型のメソッド。