モジュール内の各関数の引数のタイプを確認したいと思います(inspectモジュールを使用せずに)。私が自分で行った最も簡単な解決策は、各関数に個別にチェックを実装することです。
def func1( num1, num2 ): # the two params must be integers
if isinstance( num1, int ) and isinstance( num2, int ):
# ...function code...
pass
else:
return
def func2( float1 ): # The only param must be float
if isinstance( float1, float ):
# ...function code...
pass
else:
return
def func3( str1 ): # string
if isinstance( str1, str ):
# ...function code...
print 'fdfd'
pass
else:
return
# and, so on ...
ただし、関数ごとに実行するのではなく、モジュールレベルで実行する必要があります。各関数は異なる引数を持つことができます。これは関数のオーバーロードではないことに注意してください。デコレータかメタクラスのどちらかを書くことを考えていました。これが私が両方のアプローチで直面した問題です:-
- すべての関数に共通のデコレータを使用する:
この方法では、各関数内で定義されている実際の変数にアクセスできないため、このアイデアを破棄しました。これが私が書くことを計画していたクロージャー(デコレーターとして使用される)です:
def dec( funcName ): def typeChecker(): i = __import__( __name__ ) for m in map( lambda x: i.__getattribute__( x ), dir( i ) ): if '__call__' in dir( m ): #Identifying a real function or callable which can be treated as function ## Now, that the function is identified, what should I do here to type-check the arguments?? return typeChecker
私がこれをどのように機能させることができるかについて、ここでいくつかの洞察を提供してください。
2.関数の作成にメタクラスを
使用するメタクラスを使用して関数に送信される引数にアクセスし、各引数を検証してから、作成を担当する新しいクラスを返すことができるかどうか疑問に思っていました。関数オブジェクト。しかし、それを行う方法がわかりません。この問題を解決する良い方法ですか?
MartijnPetersが与えた1つの非常に良い提案-注釈を使用する。Python 2.7に使用できるものはありますか?