2017-06-12 16 views
0

私は、特定の値または特定のtypeの値しか取り込めないように、クラス属性の検証をしようとしています。私はvalue_typeクラス属性のいずれかの種類のために働くだろうジェネリックmatch_type機能を実装する方法を見つけようとしている次のようなアプローチPythonで2つのオブジェクトのデータ型を再帰的に比較するには?

class someClass: 

    value_types = [float, [int], "A", "B"] 

    def __init__(self, value): 
     for value_type in self.value_types: 
      if not self.match_type(value_type, value): 
       raise ValueError("The value type is invalid") 
     self.value = value 

    @staticmethod 
    def match_type(obj1, obj2): 
     """ 
     For obj1 and obj2 recursively compares all the types of containers and 
     elements inside containers, return False in case of mismatch. 
     """ 
     pass 

を作ってみました。この背後にある主な動機は、インスタンス属性valueのドメインを制限し、value_typeクラス属性に基づいて渡された値を検証することです。

だけより明確にするために、上記someClassコンストラクタで許容される値は次のようになり

  • 7.5
  • [1、9、8、6]
  • ""
  • "B"エラーが発生する必要のある

値は

ある
  • [1.2、2.3]
  • "C"
  • []
+0

あなたの質問の目的は重要ではありませんが、あなたの '__init__'関数にバグがたくさんあります。 –

+0

私に知らせてくれてありがとう、バグを修正しました。 – Satwik

答えて

0

あなたが種類の奇妙なミックスを持っているので、あなたが、しかし

x = 5 
type(x) is int 
# True 

を行うことによって、種類を確認することができます文字列の場合は、おそらく複雑なチェックが必要です。

x = [6, 3] 
type(x) is list and type(x[0]) is int 
# True 

x = 'A' 
x == 'A' or x == 'B' 
# True 

何を達成しようとしていますか?これは本質的に乱雑です

+0

私はクラス属性のドメインを制限しようとしています。 – Satwik

+0

私は文脈なしで判断するのは難しいと思うが、とにかく私が上記で述べた3つの文は、あなたの目的には十分であるはずです –

+0

実際には、すべての種類の 'value_types' – Satwik

関連する問題