web-dev-qa-db-ja.com

Python 2にヒントを入力

PEP 484 で、型ヒントがPython 3に typing モジュールを含めて追加されました。 Python 2? 。

40
Andrew

に推奨される構文Python 2.7およびストラドルコード に従って、型を定義したPEP 484によるヒント:Python 2.7との互換性のための代替構文があります。ただし、これは必須ではないため、どれだけサポートされているかわかりませんが、PEPを引用します。

一部のツールは、Python 2.7と互換性がなければならないコードで型注釈をサポートする必要がある場合があります。この目的のために、このPEPには関数注釈が#型に配置される推奨(ただし必須ではない)拡張があります:コメントこのようなコメントは、関数ヘッダーの直後(docstringの前)に配置する必要があります。例:次の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 code を参照してください。

61
Mijamo

この時点で推奨される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}
11
encolpe

Python 2タイプのコメントを解析し、入力タイプのタプルと戻り値のタイプを取得するために私が書いた関数は次のとおりです。タイピングライブラリから複雑なタイプ定義を処理するには、いくつかの作業が必要です(任意、オプション、リストなど):

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
1