Объявление параметра функции dtype не работает? - PullRequest
0 голосов
/ 28 апреля 2018

Почему это не возвращает «12»?
Знак «+» должен объединять две строки, а не добавлять их.

def foo(a:str, b:str):
    print(a+b)
foo(1,2)
3

1 Ответ

0 голосов
/ 28 апреля 2018

Это не то, для чего нужны аннотации. Аннотации метаданные , а не инструкция для Python для преобразования данных.

Из Определения функций Справочная документация :

Параметры могут иметь аннотации вида «: expression» после имени параметра. Любой параметр может иметь аннотацию даже в виде *identifier или **identifier. Функции могут иметь аннотацию «return» в виде «-> expression» после списка параметров. Эти аннотации могут быть любыми допустимыми выражениями Python и оцениваются при выполнении определения функции. Аннотации могут оцениваться в другом порядке, чем они появляются в исходном коде. Наличие аннотаций не меняет семантику функции.

(выделено жирным шрифтом).

Например, платформа хинтинга типов Python использует аннотации для присоединения информации о типе к функциям для статического анализа, проверяя, что код фактически передает типы, которые, как ожидается, будут переданы.

Просто конвертируйте ваши значения явно; в вызове:

foo(str(1), str(2))

или в самой функции:

def foo(a, b):
    print(str(a) + str(b))

или в декораторе:

import functools
import inspect

def typeconversion(f):
    """Converts arguments with a callable attached in the parameter annotation"""
    sig = inspect.signature(f)

    @functools.wraps(f)
    def wrapper(*args, **kwargs):
        # convert any argument (including defaults), for which there is a
        # callable annotation
        bound = sig.bind(*args, **kwargs)
        bound.apply_defaults()
        args = bound.arguments
        for param in sig.parameters.values():
            if param.annotation is not param.empty and callable(param.annotation):
                args[param.name] = param.annotation(args[param.name])

        # call the function with the converted arguments
        result = f(*bound.args, **bound.kwargs)

        # convert the return value
        if sig.return_annotation is not sig.empty and callable(sig.return_annotation):
            result = sig.return_annotation(result)

        return result
    return wrapper

Демо-версия:

>>> @typeconversion
... def foo(a: str, b: str) -> int:
...     return a + b
...
>>> foo(42, 101)
42101
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...