По умолчанию против необязательных параметров функции с подсказками типа - PullRequest
0 голосов
/ 18 февраля 2020

Таким образом, функция gendata принимает два необязательных параметра (name и source), а затем на основе значения source вызывает parser с теми же параметрами, которые необходимы для этой функции.

  1. Каков рекомендуемый способ определения обязательных и не обязательных параметров?
  2. В Python есть пример для typing.Types , и он показывает Type[SuperClass] должен принимать все дочерние классы, которые наследуются от него. Почему mypy жалуется в этом случае и почему только для аргументов 1 и 2, но не для 3 (source)?

exmaple.py:

from dataclasses import dataclass
from typing import List, Optional, Type


@dataclass
class BaseItem:
    name: str
    value: int


@dataclass
class Item(BaseItem):
    pass


@dataclass
class AnotherItem(BaseItem):
    pass


def parser(item: Type[BaseItem], name: str, source: int) -> Type[BaseItem]:
    item.value = source
    return item


def gendata(
    items: List[Item], name: Optional[str] = None, source: Optional[int] = None
) -> None:
    for item in items:
        if source:
            item = parser(item, name, source)

Тестирование:

$ mypy example.py 
e.py:31: error: Incompatible types in assignment (expression has type "Type[BaseItem]", variable has type "Item")
e.py:31: error: Argument 1 to "parser" has incompatible type "Item"; expected "Type[BaseItem]"
e.py:31: error: Argument 2 to "parser" has incompatible type "Optional[str]"; expected "str"
Found 3 errors in 1 file (checked 1 source file)

1 Ответ

1 голос
/ 18 февраля 2020

Прежде всего, об ошибках Type[Something], согласно документации, вы должны использовать Type[Something], когда вы получаете тип в качестве параметра, если вы получаете экземпляр BaseItem, вы должны просто использовать BaseItem.

Пример:

a = 3         # Has type 'int'
b = int       # Has type 'Type[int]'
c = type(a)   # Also has type 'Type[int]'

Ссылка: https://docs.python.org/3/library/typing.html#typing. Тип


Об ошибке Optional, Я обычно читаю необязательно как nullable (в документации даже сказано, что Optional[X] эквивалентно Union[X, None].

Ссылка: https://docs.python.org/3/library/typing.html#typing .Optional

Так что, если вы получаете параметр с типом Optional[str] и пытаетесь передать функцию, которая получает str, это вызовет ошибку, одним из решений будет просто проверить, является ли значение None, и вместо этого введите строку по умолчанию, например:

def gendata(
    items: List[Item], name: Optional[str] = None, source: Optional[int] = None
) -> None:
    if name is None:
        name = ''
    if source:
        for item in items:
            item = parser(item, name, source)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...