我有2个类。一个继承了TypedDict类,在这个类中我有一组键,它们应该接受某种类型的数据:
class UserType(TypeDict):
first_name: str
last_name: str
age: int
在另一个类Customer
中,我使用UserType
dict来存储客户的信息,并且有一个更新信息的方法:
class Customer:
def __init__():
self._userInfo: UserType = {
"first_name": "John",
"last_name": "John",
"age": 27
}
def set_info(key: str, val: Any):
self._userInfo[key] = val
在set_info
中,我想键入hint key
,以仅显示在UserType
中定义的键,例如:
customer = Customer()
customer.set_info(SHOULD HINT KEY HERE (first_name, ...), "Somedata")
dict.我试过这样的话:
def set_info(key: UserType, val: Any):
...
但这并不奏效。我想,我正试图将它用作接口,因为我来自严格的类型化语言背景。有什么想法可以实现这一点吗?我可以灵活地改变它的其他东西,而不是dict
1条答案
按热度按时间mbyulnm01#
TypedDict
不将其键公开为不同类型,也没有真正好的方法来定义这样的类型。不推荐
有些人使用
typing.Literal
,但这是为了,嗯,* 文字 *。使用key: Literal["first_name", "last_name", "age"]
允许c.set_info("first_name", "bob")
,但不允许k = "first_name"; c.set_info(k, "bob")
,因为k
不是文字。我不建议这样做,但我觉得需要解决这个问题。"更好"
另一种方法是显式定义单独的枚举类型,并使用其成员(而不是原始键)作为参数。
更好
这是假设您没有很好的理由单独存储属性,并且只使用
TypedDict
作为类方法的参数,例如,最佳(假设)
下面的内容不要读得太多,我主要是在考虑
TypeDict
如何将其包含的信息公开为类型提示。在理想的情况下,
TypedDict
的键本身会形成一个类型。更好的是,还有一种方法可以将分配给
key
的值绑定到一个可以用来注解val
的类型,这样,如果key == "first_name"
,则val
必须具有type 'str。(其中类型可以依赖于值)、单例类型(其中每个值都有一个关联的类型,该类型 * 仅 * 包含该值)和泛型。