24

我正在使用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

我想现在它看起来更好了,但是 AFAIK 通过像这样编写这些变量,我使它们成为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 建议的那样注释那些类型,还是应该内联?

4

2 回答 2

20

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__永远不会返回值。

谢谢。

于 2020-01-17T09:10:32.133 回答
7

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

类型注解也可以用来注解类体和方法中的类和实例变量。特别是,无值表示法a: int允许注释应该在__init__or中初始化的实例变量__new__

MyPy文档也是一个很好的类型提示资源

于 2020-03-21T10:06:26.853 回答