Я давний разработчик 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
Каковы недостатки использования этоготехника будет?Каковы будут недостатки моей наивной реализации на pastebin ?
Я не хочу получать ответы на вопросы о преобразовании Python в язык со статической типизацией, но думаю о разработке API.конкретные плюсы / минусы.(переместите это на programmers.stackexchange.com, если считаете, что это не вопрос)