私は長い間 Python 開発者であり、言語の動的な性質が大好きですが、Python がオプションの静的型付けの恩恵を受けるかどうか疑問に思っています。 ライブラリの API に静的型付けを適用できると便利でしょうか? また、これにはどのような欠点がありますか?
Pastebin で実行時静的型チェックを実装するデコレータを簡単にスケッチしたところ、次のように動作します。
# A TypeError will be thrown if the argument "string" is not a "str" and if
# the returned value is not an "int"
@typed(int, string = str)
def getStringLength(string):
return len(string)
ライブラリの API 関数でこのようなデコレータを使用することは実用的でしょうか? 私の観点では、ライブラリのドメイン固有モジュールの内部動作では型チェックは必要ありませんが、ライブラリとそのクライアントの間の接続ポイントでは、型チェックを適用することによる契約による単純なバージョンの設計が役立つ可能性があります。特に、ライブラリのクライアントに対して何を期待し、何を返すかを明確に示す強制ドキュメントの一種として。
この例のように、addObjectToQueue()
とisObjectProcessed()
はクライアントが使用するために公開されておりprocessTheQueueAndDoAdvancedStuff()
、内部ライブラリ関数です。型チェックは外向きの関数では役立つと思いますが、内部関数で使用すると、python の動的性と有用性が肥大化して制限されるだけです。
# some_library_module.py
@typed(int, name = string)
def addObjectToQueue(name):
return random.randint() # Some object id
def processTheQueueAndDoAdvancedStuff(arg_of_library_specific_type)
# Function body here
@typed(bool, object_id = int)
def isObjectProcessed(object_id):
return True
この手法を使用することの欠点は何ですか? ペーストビンでの私の素朴な実装の欠点は何ですか?
Python を静的に型付けされた言語に変換することについて議論する回答ではなく、API 設計固有の長所と短所についての考えです。(質問ではないと考える場合は、これをprogrammers.stackexchange.comに移動してください)