Я практикуюсь в использовании подсказок типов в Python 3.5. Один из моих коллег использует typing.Dict
:
import typing
def change_bandwidths(new_bandwidths: typing.Dict,
user_id: int,
user_name: str) -> bool:
print(new_bandwidths, user_id, user_name)
return False
def my_change_bandwidths(new_bandwidths: dict,
user_id: int,
user_name: str) ->bool:
print(new_bandwidths, user_id, user_name)
return True
def main():
my_id, my_name = 23, "Tiras"
simple_dict = {"Hello": "Moon"}
change_bandwidths(simple_dict, my_id, my_name)
new_dict = {"new": "energy source"}
my_change_bandwidths(new_dict, my_id, my_name)
if __name__ == "__main__":
main()
Оба они работают нормально, разницы нет.
Я прочитал typing
документацию к модулю .
Между typing.Dict
или dict
какой из них использовать в программе?
python
dictionary
type-hinting
Сарит
источник
источник
def a(b: int) -> bool:
это синтаксическая ошибка в Python 2.7, и я думаю, что это синтаксическая ошибка и в более старых версиях Python 3.Ответы:
Нет никакой реальной разницы между использованием простого
typing.Dict
иdict
, нет.Тем не менее,
typing.Dict
это тип Generic , который позволяет указать тип ключей и значений тоже , что делает его более гибким:def change_bandwidths(new_bandwidths: typing.Dict[str, str], user_id: int, user_name: str) -> bool:
Таким образом, вполне может быть, что в какой-то момент жизненного цикла вашего проекта вы захотите более точно определить аргумент словаря, и в этот момент расширение
typing.Dict
доtyping.Dict[key_type, value_type]
будет «меньшим» изменением, чем заменаdict
.Вы можете сделать это еще более универсальным, используя здесь типы
Mapping
илиMutableMapping
; поскольку вашей функции не нужно изменять отображение, я бы придерживалсяMapping
. Adict
- это одно отображение, но вы можете создать другие объекты, которые также удовлетворяют интерфейсу сопоставления, и ваша функция вполне может работать с ними:def change_bandwidths(new_bandwidths: typing.Mapping[str, str], user_id: int, user_name: str) -> bool:
Теперь вы четко рассказать другим пользователям этой функции , что ваш код не будет фактически изменяющие на
new_bandwidths
отображение передается в.Ваша фактическая реализация просто ожидает объект, который можно распечатать. Это может быть тестовая реализация, но в ее нынешнем виде ваш код продолжал бы работать, если бы вы использовали его
new_bandwidths: typing.Any
, потому что любой объект в Python можно распечатать.источник
{"name": "bob", "age" : 51}
, будет ли это что-то вродеtyping.Mapping[Union[str, int]
? А как насчет вложенного словаря, вроде{"person": {"name":"bob", "age": 51}
бы это было что-то вродеtyping.Mapping[str, typing.Mapping[Union[str, int]]
? Такое использованиеUnion
беспокоит меня, потому что это не строгая схема, поскольку нет упорядочивания. Может это нормально, или есть альтернатива?Union
Не обращайте внимания на вопрос, который, я вижу, это все еще открытое обсуждение github.com/python/typing/issues/28typing.Dict
это общая версияdict
:Здесь вы можете указать тип ключа и значений в dict:
Dict[str, int]
источник