问题描述
TLDR:这是一个有关在Python中编码非常规“类型”的最佳方法的最佳方法的特定问题-IMHO(作为3年级中级python开发人员)可能是我遇到的最大问题“如何在Python中轻松做到这一点”。
背景
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)
}
所以可以说我的第一个要求是 必须有要求:
- 轻松声明非固定类型
注意-目标/要求是一次性定义非固定类型-不使用分别定义所有成员然后组成最终类型的组合方式
现在也要说我想要-不是必须的,而是真正喜欢-在我的代码中要完成的另外两件事 很高兴有要求:
所以:
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)(非平面复合类型)在语法和概念上都很容易。
- 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 (将#修改为@)