2012-04-28 12 views
1

属性に割り当てるときにPythonクラスが値の型を自動的にチェックするようにします。静的に型指定されたクラス属性用のPythonモジュール

enthoughtのtraitsモジュールがあり、IPythonのサブモジュールには、純粋なpythonバージョンIPython.utils.traitletsがあります。類似のモジュールはありますか?そのモジュールにこれらの属性を設定するための自動コマンドライン引数パーサーがある場合は、それが良いでしょう。

EDIT:スニペットに感謝します。しかし、私はPython ライブラリが欲しいです。それを行うライブラリがあれば、私は自分自身で再実装したくありません。

+5

なぜ動的に型指定された言語の型付き変数を使用しますか? – Blender

+0

自動チェックを定義します。あなたはいつもタイプを完成させることができます。 – CppLearner

+0

静的な入力を気にする人は、間違った言語を使用しています。 –

答えて

2

本当に私はおよそtraitsを知らない...しかし、あなたはそれが割り当てられている場合にオブジェクトの種類を確認したい場合は、あなたがそれをチェックするために__setattr__を上書きすることができます...

class MyClass(object): 
    def __setattr__(self, attr, val): 
     if attr == 'my_attr': 
      if not isinstance(val, str): 
       raise ValueError('my_attr must be a string!') 
      else: 
       object.__setattr__(self, attr, val) 
     else: 
      object.__setattr__(self, attr, val) 

a = MyClass() 
a.my_attr = "Hello World!" # This is OK 
a.my_attr = 1    # This is not: ValueError 

しかし、私本当に良い理由なしにこれを行うことをお勧めしません...

1

ほとんどの "自動"動作は、Python記述子を使用してオブジェクト属性で決めることができます。最も単純な記述子の種類はpropertyです。

class Foo(object): 
    @property 
    def bar(self): 
     try: 
      return self._bar 
     except AttributeError: 
      return "default value" 

    @bar.setter 
    def bar(self, value): 
     if isinstance(value, Baz): # for some other type "Baz" 
      self._bar = value 
     else: 
      raise ValueError("wrong type for attribute bar," 
          " expected %r, got %r" % (Baz, type(value)) 
+0

私はちょうどこれをまた見て、自分自身に "それは財産のための完璧な場所です"と考えました。私はそれを私の答えに加えようとしていましたが、あなたはすでにそれをやったことが分かります。 +1 – mgilson

関連する問題