Python定义的“类型”-中级开发人员宠物peeve

问题描述

TLDR:这是一个有关在Python中编码非常规“类型”的最佳方法的最佳方法的特定问题-IMHO(作为3年级中级python开发人员)可能是我遇到的最大问题“如何在Python中轻松做到这一点”。

对于主持人:我确实在底部有特定的代码和问题:D

背景

可以说我正在写一些代码,并且需要一个非原始变量类型:

因此,在元代码中,我想在我的代码中定义此代码以供以后使用:

MyType = type {
    mouth: bool
    nose: string
}

现在让我说我需要的变量类型不是'flat':

MyType = type {
    mouth: bool
    nose: string
    hair: {
        color: string
        length: float
    }
}

现在可以说,我希望能够轻松地(在语法上)创建实例和引用属性(再次是元代码):

anInstance = MyType(
    mouth=True,nose='big',hair=(color='red',length=5.5)
)

if anInstance.mouth {
    print('has a mouth,and hair is',anInstance.hair.color)
}

所以可以说我的第一个要求是 必须有要求:

  1. 轻松声明非固定类型

注意-目标/要求是一次性定义非固定类型-不使用分别定义所有成员然后组成最终类型的组合方式

现在也要说我想要-不是必须的,而是真正喜欢-在我的代码中要完成的另外两件事 很高兴有要求:

  1. 在运行类型中检查属性类型的正确性
  2. 我的类型受到限制,所以我不能随意添加属性

所以:

anInstance.nose = 5.5     # -> this tells me when it runs that it's Bad - wrong type
anInstance.chin = 'hairy' # -> Bad too - this attribute isn't declared in the deFinition

问题

我的见解和经验:上面的概念(声明非固定类型...也可能具有属性类型和定义强制性)在python中不容易

我的意思是“不容易做到”是

  1. 没有统一的标准方法
  2. 在大多数python类/教程等中,它并没有被很多/很好/很早地涵盖-尽管恕我直言,这是非常常见的代码结构要求

但是,在其他(大多数?)其他语言中,上述要求-特别是仅(1)(非平面复合类型)在语法和概念上都很容易。


...我知道有些人会回复

  • python是鸭子类型的,所以只需对其进行处理
  • 做个男人,用类工厂自己写一遍
  • 只需使用我最喜欢的模块/功能/元类模板模型X,Y或Z或... *
  • 只需使用字典即可​​,并使用点'固定。属性引用。
  • 只使用递归嵌入的lambda定义的认字典
  • ... ... ...

...所有正确的观点-但是我仍然认为上述简单的需求还不足够,大量不同的做事方式是一个问题,而这确实是' t(IHMO)在许多初学者/中级类型指南中都说明了该怎么做,即使它是应用程序中的常见用例需求


非真实的解决方

我可以通过将dataclass嵌入dataclass中来轻松满足要求(1):


@dataclass
class MyType:

    @dataclass
    class HairType:
        color: str
        length: float

    mouth: bool
    nose: str
    hair: HairType

同样,我可以使用嵌入式命名元组。我还可以使用任意数量的模块(marshmellow,pydantic,...,...)。

但是-再一次-我的争用/观察-这并不简洁明了(可能/应该吗?),并且有X种不同的处理方式,即使(IMHO)这是一个常见的要求。 / p>

问题

  • 对于上述类型定义(以及可选的属性检查目标),人们使用什么方法? ...不同选择的优缺点是什么?
  • 是否可以通过python中的一种非常简单,简洁的方式来完成上述操作-尤其是仅满足要求(1)?
  • 一个人在想a)这是一个普遍的要求,并且b)用Python(与某些其他语言相比)并不容易且不容易

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)