Python类成员键入提示

时间:2018-12-22 15:42:35

标签: python python-3.x pycharm python-typing

我正在使用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_dataself.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建议的类型,还是应该以内联方式进行注释?

2 个答案:

答案 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也是类型提示的好资源