Python 3 带有已知键类型的字典。

85

我正在使用Python 3的类型特性来获得更好的自动补全效果。

很多时候我有一些返回特定键的键/值(字典)的函数,以下是非常简单的示例:

def get_info(name):
    name_first_letter = name[0]
    return {'my_name': name, 'first_letter': name_first_letter}

我希望为这个函数添加类型提示,以便告诉其他使用这个函数的人可以期待什么。

我可以像这样做:

 class NameInfo(object):
     def __init__(self, name, first_letter):
         self.name = name
         self.first_letter = first_letter

然后将函数签名更改为:

def get_info(name) -> NameInfo:

但是每个字典都需要太多的代码。

在这种情况下,最佳实践是什么?


2
你考虑过使用collections.namedtuple来创建你的自定义类型吗?它仅创建不可变类型,但根据以前你如何使用字典的情况,这可能不是问题。 - Blckknght
10
您可以尝试使用来自 typing 模块的 Dict[str, str] 类型提示。 - Stanislav Ivanov
5
@Blckknght 谢谢你提醒我这个选项。我找到了我需要的东西。有一个叫做“命名元组”的类型,可以在这里找到:https://docs.python.org/3/library/typing.html#typing.NamedTuple - Idok
1
参见:https://dev59.com/EVUK5IYBdhLWcg3w_z20 - krassowski
显示剩余2条评论
2个回答

106

正如Blckknght和Stanislav Ivanov在评论中指出的那样,您可以使用NamedTuple

from typing import NamedTuple


class NameInfo(NamedTuple):
    name: str
    first_letter: str


def get_info(name: str) -> NameInfo:
    return NameInfo(name=name, first_letter=name[0])

从Python 3.8开始,你可以使用TypedDict,它更接近你想要的:

from typing import TypedDict


class NameInfo(TypedDict):
    name: str
    first_letter: str


def get_info(name: str) -> NameInfo:
    return {'name': name, 'first_letter': name[0]}

通过这种方式,您会得到一些特定于类的限制,例如您无法使用msgpack打包您的类。 - Prisacari Dmitrii
如何定义NameInfo具有服务符号的键,例如last#name:str - Ivan Bryzzhin
@IvanBryzzhin 你可以尝试使用替代语法 - Georgy
这仅适用于 str 键。 - Jerinaw

5
可以使用类型名称和字典来创建TypedDict,其中键是键,值是值的类型,分别对应于由get_info()返回的字典。
from typing import TypedDict

NameInfo = TypedDict('NameInfo', {'name': str, 'first-letter': str})

def get_info(name: str) -> NameInfo:
    return {'name': name, 'first-letter': name[0]}

x = get_info('cottontail')
print(x['first-letter'])   # c

然后在PyCharm上,关键提示就在那里。

pycharm


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接