我正在使用PyCharm
开发一些Python应用程序。我正在尝试使用尽可能先进的python,所以我在利用新的python功能。我对type hinting
有疑问。
让我们一起来看看我的DataAnalyzer
类:
class DataAnalyzer:
def __init__(self, train_data: pd.DataFrame, test_data: pd.DataFrame) -> None:
self.train_data = train_data
self.test_data = test_data
def analyze(self):
pass
现在PyCharm向我发送黄色灯泡,让我向self.train_data
和self.test_data
添加类型注释。如果我单击此消息这样做,PyCharm将在我的课程开始时添加两行:
class DataAnalyzer:
train_data: pd.DataFrame
test_data: pd.DataFrame
def __init__(self, train_data: pd.DataFrame, test_data: pd.DataFrame) -> None:
self.train_data = train_data
self.test_data = test_data
def analyze(self):
pass
我想现在看起来更好了,但是通过写这样的变量,我使它们成为 static 。
我考虑过要注释这样的类型:
class DataAnalyzer:
def __init__(self, train_data: pd.DataFrame, test_data: pd.DataFrame) -> None:
self.train_data: pd.DataFrame = train_data
self.test_data: pd.DataFrame = test_data
def analyze(self):
pass
当然还不清楚,但是当我不想这么做时,我不会使班级成员成为静态成员。
我知道,通过在方法签名中注释类型,在我刚分配它们时再做一次是过大的,但是我要的是一般规则。我应该注释那些像PyCharm建议的类型,还是应该以内联方式进行注释?
答案 0 :(得分:5)
PyCharm的建议是正确的。实际上,我认为以下代码会更好:
class DataAnalyzer:
train_data: pd.DataFrame
test_data: pd.DataFrame
def __init__(self, train_data, test_data):
self.train_data = train_data
self.test_data = test_data
def analyze(self):
pass
说明:
__init__
函数中注释参数。-> None
之后的__init__
。对于__init__
,永远不要返回值。谢谢。
答案 1 :(得分:2)
两个选项均有效-签出pep 526
类型注释也可用于注释类主体和方法中的类和实例变量。特别是,无值注释
a: int
允许注释应该在__init__
或__new__
中初始化的实例变量。
MyPy documentation也是类型提示的好资源