Python class 成员类型提示

Python class members type hinting

我正在使用 PyCharm 开发一些 Python 应用程序。我正在尝试尽可能使用最先进的 python,因此我正在使用新的 python 功能。 type hinting.

我有问题

大家来看看我的DataAnalyzer class:

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:

的开头添加两行
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

这绝对不清楚,但我不想让 class 成员静态化。

我知道,通过在方法签名中注释类型,当我只分配这些类型时再做一次,是一种矫枉过正,但我​​要求的是一般规则。我应该像 PyCharm 建议的那样注释那些类型,还是应该内联注释这些类型?

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__ 函数中注释参数。
  • __init__后的
  • -> None可以省略。对于 __init__ 永远不会 return 一个值。

谢谢。

两个选项都有效 - 查看 pep 526

Type annotations can also be used to annotate class and instance variables in class bodies and methods. In particular, the value-less notation a: int allows one to annotate instance variables that should be initialized in __init__ or __new__.

MyPy documentation 也是类型提示的好资源