我正在阅读 这里 ,但它是关于命名元组的类型提示。
是否可以为包含
List
的
namedtuple
创建类型提示?
例如:|| |我尝试过:
firefoxprofile = namedtuple("Profile", ["Name", "Path", "isRelative", "Default"])
# Will contain a list of tuples that represent the firefox profiles.
ffprofiles = [] # -- how would I write the type hint?
ffprofiles.append(Profile(Name='Jason', Path='Profiles/er5rtak4.Jason', isRelative='1', Default=None))
ffprofiles.append(Profile(Name='Sarah', Path='Profiles/23mvfqcj.Sarah', isRelative='1', Default=None))
但这不起作用,当我尝试使用该语法更新
ffprofiles = List[namedtuple("Profile", ["Name", "Path", "isRelative", "Default"])]
行时,出现异常:
ffprofiles = []
line with that syntax, I get an exception:
TypeError: descriptor 'append' requires a 'list' object but received a 'Profile'
在尝试使用
namedtuple("Profile", ["Name", "Path", "isRelative", "Default"])
作为类型提示时,会遇到
TypeError
,这是因为在类型提示的上下文中,调用
namedtuple
会实际创建新的命名元组
类
,而不是该类的
实例
。
可以通过首先创建
Profile
命名元组类,然后在类型提示中使用它来解决此问题:
from typing import List, NamedTuple
# 创建 Profile 命名元组类
Profile = NamedTuple("Profile", [("Name", str), ("Path", str), ("isRelative", str), ("Default", Optional[str])])
# 现在可以将 Profile 类用于类型提示
ffprofiles: List[Profile] = []
# 添加配置文件
ffprofiles.append(Profile(Name='Jason', Path='Profiles/er5rtak4.Jason', isRelative='1', Default=None))
ffprofiles.append(Profile(Name='Sarah', Path='Profiles/23mvfqcj.Sarah', isRelative='1', Default=None))
此代码将按预期工作,并且的类型提示现在将正确地反映
ffprofiles
是
Profile
命名元组的列表。