Python 重用数据类类型提示

Python 重用数据类类型提示,python,python-3.x,alias,mypy,python-typing,Python,Python 3.x,Alias,Mypy,Python Typing,我试图在函数签名中重用来自数据类的类型提示——也就是说,不必再次键入签名 最好的办法是什么 从数据类导入数据类 从输入导入集、元组、类型 @数据类 类别MyDataClass: 强制:设置[元组[str,float,bool]] #我必须在dataclass和 #函数签名-恶心 def do_something(强制:Set[Tuple[str,float,bool]]: 印刷品(原力) #我想这样做,在这里我引用 #数据类。但是,通过这种方式,pycharm认为“force”是“Any”类型`

我试图在函数签名中重用来自数据类的类型提示——也就是说,不必再次键入签名

最好的办法是什么

从数据类导入数据类
从输入导入集、元组、类型
@数据类
类别MyDataClass:
强制:设置[元组[str,float,bool]]
#我必须在dataclass和
#函数签名-恶心
def do_something(强制:Set[Tuple[str,float,bool]]:
印刷品(原力)
#我想这样做,在这里我引用
#数据类。但是,通过这种方式,pycharm认为“force”是“Any”类型`
def do_something_2(强制:键入[“MyDataClass.force”]):
印刷品(原力)
最好的办法是什么

PEP 484为这种情况提供了一个明确的选项

类型别名由简单变量指定定义: (...) 类型别名可能与注释中的类型提示一样复杂——任何可以接受为类型提示的内容都可以在类型别名中接受:

应用于您的示例,这将相当于(Mypy确认这是正确的)

从数据类导入数据类
你的类型=set[tuple[str,float,bool]]
@数据类
类别MyDataClass:
力量:你的类型
def do_something(强制:您的类型):
印刷品(原力)
以上内容是使用Python3.9以后的版本编写的。自那时以来,语法更加简洁和现代,并已被弃用



现在,完全理解这一点比看起来要复杂得多:

每个对象都有一个标识、一个类型和一个值

你第一次尝试使用
类型
会得到一个惊人的结果

>类型(MyDataClass.force)
AttributeError:类型对象“MyDataClass”没有属性“force”
这是因为内置函数
type
返回一个类型(它本身就是一个对象),但
MyDataClass
是“一个类”(一个声明),“Class属性”
force
位于类上,而不是
type()
查找它的类的type对象上。请注意数据模型中的差异:

  • 班级

    这些对象通常充当自身新实例的工厂

  • 类实例

    任意类的实例

相反,如果在实例上检查类型,则会得到以下结果

>>init_值:set={(True,“the_str”,1.2)}
>>>a_var=MyDataClass(初始值)
>>>类型(a_变量)
>>>类型(a_变量力)
现在,让我们通过将
type()
应用于类声明对象上的来恢复
force
上的类型对象(而不是类型提示)(这里我们看到前面提到的)。(这里我们确实在检查class属性
force
上的type对象)

>>>类型(MyDataClass.\uuuuuu注释\uuuu['force']))
或者我们可以检查类实例上的注释,并恢复我们习惯于看到的类型提示

>>init_值:set={(True,“the_str”,1.2)}
>>>a_var=MyDataClass(初始值)
>>>变量注释__
{'force':set[tuple[str,float,bool]}
我必须在数据类和函数签名中编写相同的类型注释-

对于元组,注释趋向于变为长文本,这就需要创建一个简洁的目的变量。但一般来说,显式签名更具描述性,这正是大多数API所追求的

基本构造块:

Tuple,用于列出元素类型,例如
Tuple[int,int,str]
。空元组可以键入为
tuple[()]
。任意长度的同构元组可以使用一种类型和省略号表示,例如
Tuple[int,…]
。(这里是语法的一部分,一个文字省略号。)


你不能那样做。您可以使用类型别名,
GoodName=Set[Tuple[str,float,bool]
并且只需重复使用它,
GoodName
而且,这实际上与dataclasses@juanpa.arrivillaga谢谢你的创意。我希望避免像那样创建辅助变量,但这确实是一个解决方案。是的,这与数据类无关,只是为了方便说明这个问题。绝对非常酷和有洞察力,谢谢@fishstix44一个小细节不够精确,但我明天会重新措辞。很高兴你喜欢它。