サブクラスでPythonの引数を検証
-
20-08-2019 - |
質問
私はいくつかのpythonの引数を検証しようとしています。私たちはPython 3.0で新しい静的型付けを取得するまでは、このついて行くの最善の方法は何かます。
ここでは、私がしようとしています何の例です。
class A(object):
@accepts(int, int, int)
def __init__(a, b, c):
pass
class B(A):
@accepts(int, int, int, int)
def __init__(a, b, c, d):
A.__init__(a, b, c)
あなたはデコレータがうまく私のクラスへの入力の型検査を行っているが、私は、私は複数レベルの継承を持っているときに、非常に厄介な取得する第二のクラスにすべての引数を定義する必要が見ることができるように。私はある程度の成功を収めてkwargsから使用することができますが、それは型チェックのための上記のアプローチほど素敵ではありません。
基本的に私は、これはスケールとしてkwargsからリストオフ一つの引数をポップし、それがタイプだ確認し、それは親だし、残りを渡すが、非常に柔軟かつクリーンな方法でこれをやりたい。
任意の提案ですか?
解決
なぜだけではなくany
値を定義し、@accepts(any, any, any, int)
とサブクラスのコンストラクタを飾りますか?あなたのデコレータはany
でマークされたパラメータをチェックしませんし、スーパークラスのコンストラクタに@accepts
は、サブクラスによって、それまでに渡されたすべての引数をチェックします。
他のヒント
あなたはinspect
モジュールで遊んする場合があります。それはあなたがスーパークラス、引数リスト、およびその他の楽しいものを列挙できるようになります。あなたがスーパー__init__
メソッドの引数リストを検査し、あなたはサブクラスに持っているものに対してそれを比較することができますようです。私はこれがあなたのために仕事に行くされているかどうかわからない。
私はあなたがが作るものの前提に関する注意が必要だろう。クラスAは__init__
する N の引数を持っているという理由だけで、サブクラスは、少なくとも N の引数が含まれており、最初ののN スーパークラスに至ります。サブクラスは、より具体的であれば、それはそのスーパークラスの__init__
メソッドの引数の2により、全てに記入することがあります。