已知密钥键入的Python 3字典

Ido*_*dok 19 python dictionary type-hinting python-3.x

我正在使用python3输入功能来获得更好的自动完成功能.

很多时候,我有使用特定键返回键/值(字典)的函数.超级简单的例子:

def get_info(name):
    name_first_letter = name[0]
    return {'my_name': name, 'first_letter': name_first_letter}
Run Code Online (Sandbox Code Playgroud)

我想在此函数中添加类型提示,以告诉使用此函数的其他人期待什么.

我可以这样做:

 class NameInfo(object):
     def __init__(self, name, first_letter):
         self.name = name
         self.first_letter = first_letter
Run Code Online (Sandbox Code Playgroud)

然后将函数签名更改为:

def get_info(name) -> NameInfo:
Run Code Online (Sandbox Code Playgroud)

但它需要为每个字典提供太多代码.

在这种情况下,最佳做法是什么?

cot*_*ail 9

TypedDict也可以使用类型名和字典来创建,其中键是要返回的字典的键,值是值的类型get_info()。这允许您创建使用非A-Za-z0-9_.

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
Run Code Online (Sandbox Code Playgroud)

然后在 PyCharm 上,关键提示就在那里(也可以通过按 Tab 键在 jupyter 笔记本上使用)。

pycharm


Ber*_*ard 7

正如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])
Run Code Online (Sandbox Code Playgroud)

从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]}
Run Code Online (Sandbox Code Playgroud)