对包含一个命名元组的列表进行类型提示

8 浏览
0 Comments

对包含一个命名元组的列表进行类型提示

我在这里看到了这个问题,但它是关于对命名元组进行类型提示的。\n是否可以为包含namedtupleList创建类型提示?\n例如:\n

firefoxprofile = namedtuple("Profile", ["Name", "Path", "isRelative", "Default"])
# 将包含一个表示firefox配置文件的元组列表。
ffprofiles = [] # -- 我该如何写类型提示?
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))

\n我尝试了:\n

ffprofiles = List[namedtuple("Profile", ["Name", "Path", "isRelative", "Default"])]

\n但是这不起作用,当我尝试用那种语法更新ffprofiles = []这一行时,会出现异常:\n

TypeError: descriptor 'append' requires a 'list' object but received a 'Profile'

0
0 Comments

问题的出现原因是在类型提示中使用了`List[]`,但没有明确指定命名元组的名称,只是引用了类型的名称。解决方法是在赋值语句中,在等号之前使用冒号,遵循PEP 526变量注释的语法,将类型提示放在冒号后面。这样可以告诉类型提示检查器列表的内容必须是命名元组类型的实例。如果想在列表中提供一些初始配置文件,只需将它们包含在列表文字中,无需在后面追加。

在代码中,使用`namedtuple()`生成的类被赋值给`firefoxprofile`,所以在其余代码中使用`firefoxprofile`来引用它,而不是使用`Profile`。可能希望将`namedtuple()`的结果分配给作为第一个参数传递的相同名称,如`Profile = namedtuple('Profile', ...)`。

然而,可能还希望使用`typing.NamedTuple`类来定义有类型的命名元组,以解决上述问题。定义一个继承自`typing.NamedTuple`的类具有与使用`namedtuple()`函数相同的结果,只是语法更简洁,可以为字段添加类型,还可以选择添加文档字符串和其他属性或方法。

现在,类型提示机制将更清楚地了解预期的内容。不仅现在清楚列表将包含哪种类型的实例,上述代码还记录了命名元组类支持的属性以及每个属性的类型。在这里,我根据猜测的类型进行了一些推测。我还使用了Python的PEP-8样式规定,因此命名元组的属性都使用小写下划线(“snake_case”),而不是驼峰式。后者通常只用于类名。

如果你的问题被投票下降,我也不知道原因,因为我不能读心。你的问题可能缺乏分享你的研究,或者那些投票的人觉得你在发布之前应该对Python的类型提示语法进行更多的研究。如果你确实进行了这方面的研究,请确保在你的帖子中分享出来。

好建议!下次会更努力的。

0