В PEP 484 подсказването на типа беше добавено към Python 3 с включването на typing
модул. Има ли някакъв начин да направите това в Python 2? Всичко, за което мога да се сетя, е да имам декоратор, който да добавя към методите за проверка на типове, но това ще се провали по време на изпълнение и няма да бъде уловено по-рано, както би позволило подсказването.
Подсказване на типа в Python 2
Отговори (3)
Според Предложен синтаксис за Python 2.7 и трансграничен код в PEP 484, който дефинира подсказване на типа, има алтернативен синтаксис за съвместимост с Python 2.7. Това обаче не е задължително, така че не знам колко добре се поддържа, но цитирам PEP:
Някои инструменти може да искат да поддържат анотации за тип в код, който трябва да е съвместим с Python 2.7. За тази цел този PEP има препоръчително (но не задължително) разширение, където анотациите на функцията се поставят в # тип: коментар. Такъв коментар трябва да бъде поставен непосредствено след заглавката на функцията (преди документалния низ). Пример: следният код на Python 3:
def embezzle(self, account: str, funds: int = 1000000, *fake_receipts: str) -> None: """Embezzle funds from account using fake receipts.""" <code goes here>
е еквивалентно на следното:
def embezzle(self, account, funds=1000000, *fake_receipts): # type: (str, int, *str) -> None """Embezzle funds from account using fake receipts.""" <code goes here>
За поддръжка на mypy
вижте Проверка на типа Python 2 кода.
__doc__
attr и __annotations__
attr не е налично в Python 2.
- person Czarek Tomczak; 04.03.2016
На този етап препоръчителният и съвместим с python3 начин е да следвате ръководството за python2 до 3: http://python-future.org/func_annotations.html
def embezzle(self, account: str, funds: int = 1000000, *fake_receipts: str) -> None:
"""Embezzle funds from account using fake receipts."""
pass
Да стане:
def embezzle(self, account, funds = 1000000, *fake_receipts):
"""Embezzle funds from account using fake receipts."""
pass
embezzle.__annotations__ = {'account': str, 'funds': int, 'fake_receipts': str, 'return': None}
List
, Set
- person Jorge Leitao; 25.09.2018
Ето една функция, която написах, за да анализира коментара на типа Python 2 и да получи кортеж от типове вход и тип връщане. Ще е необходима малко работа, за да работите със сложни дефиниции на типове от библиотеката за въвеждане (Any, Optional, List и т.н.):
class InvalidTypeHint(Exception):
pass
PYTHON_2_TYPE_HINT_REGEX = "\s*#\s*type:\s*(\(.+\))\s*->\s*(.+)\s*"
def parse_python_2_type_hint(typehint_string):
# type: (str) -> (tuple, type)
pattern = re.compile(PYTHON_2_TYPE_HINT_REGEX)
search_results = pattern.search(typehint_string)
if not search_results:
raise InvalidTypeHint('%s does not match type hint spec regex %s' % (typehint_string, PYTHON_2_TYPE_HINT_REGEX))
arg_types_str = search_results.group(1)
return_type_str = search_results.group(2)
try:
arg_types_tuple = eval(arg_types_str)
assert isinstance(arg_types_tuple, tuple)
return_type = eval(return_type_str)
assert isinstance(return_type, type)
except Exception as e:
raise InvalidTypeHint(e)
return arg_types_tuple, return_type
def parse_arg_types_for_callable(func):
# type:(callable)->tuple
"""
:param func:
:return: list of parameter types if successfully parsed, else None
"""
# todo make this compatible with python 3 type hints
# python 2.7 type hint
source_lines = inspect.getsource(func).split("\n")
def_statements = 0
for source_line in source_lines:
try:
arg_types_tuple, return_type = parse_python_2_type_hint(source_line)
return arg_types_tuple
except InvalidTypeHint:
if source_line.strip().startswith("def "):
def_statements += 1
if def_statements > 1:
return None