gpt4 book ai didi

python - 区分类型别名和实际类的约定?

转载 作者:太空宇宙 更新时间:2023-11-03 15:45:27 26 4
gpt4 key购买 nike

输入模块允许将复杂的类型签名分配给 aliases ,然后可以与实际类型互换使用。这似乎存在将类型别名与实际类混淆的问题,即在这样的定义中

def foo(obj: MyComplexObject):
...

没有办法判断 MyComplexObject 是作为某个地方的类实现的,还是只是一个类型别名。这对我来说似乎是一个不幸的混淆来源,特别是当别名被(重新)使用远离其原始定义时。这是否被普遍接受,或者是否存在以某种方式将类型别名与实际类区分开来的约定?

最佳答案

我认为类型别名和常规类型在设计上是无法区分的:类型别名意味着它们作为别名的任何类型的确切替代。

因此,使用您的示例,MyComplexObject 是实际类还是类型别名并不一定重要:它们在运行时和静态类型检查时的行为相同。

并且因为类型检查器可以立即反馈您是否以类型安全的方式使用 obj,所以混淆的可能性很小:要么您将使用obj 参数是否正确,否则您会立即得到反馈。 (同样,理解 PEP 484 语义的 Pycharm 等 IDE 也将理解类型别名,并将正确地自动完成/标记错误。)

还值得注意的是,在您专门为其他类设置别名的情况下,别名和原始类在运行时几乎无法区分:它们都是引用同一基础类型对象的变量。 (因此可以说,实际上没有什么可混淆的:别名和原始类型都是“同一件事”。)

因此,几乎没有动力去寻找区分类型和类型别名的命名约定——这在实践中并没有真正成为问题。


也就是说,对于何时使用类型别名,一些隐式约定。例如,人们通常不会直接给类起别名:正如 Ethan 所说,类型别名主要用于帮助简化在多个地方重复的较大复合类型。

这意味着类型别名主要用于当你有一堆非常难看的类型签名时。然后它变成了一种“权衡”之类的事情:读者确实需要花时间查找别名的定义并将其缓存在他们的脑海中,但是一旦他们这样做了,阅读其余代码应该会更加愉快。

因此,如果您仍然发现类型别名可能会造成混淆,并且除非必要,否则宁愿避免使用它们,那也很好:这几乎是其他人所做的。唯一的区别在于您何时跨越了从“不必要”到“必要”的临界点。

关于python - 区分类型别名和实际类的约定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50199608/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com