Python 类成员类型提示

问题描述 投票:0回答:2

我正在使用

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

我想现在它看起来更好了,但是据我所知,通过像这样编写这些变量,我使它们静态

我考虑过这样注释类型:

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 建议的那样注释这些类型,还是应该内联执行此操作?

python pycharm python-typing
2个回答
32
投票

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

13
投票

两个选项均有效 - 请查看 pep 526

类型注释还可以用于注释类体和方法中的类和实例变量。特别是,无值符号

a: int
允许注释应在
__init__
__new__
中初始化的实例变量。

MyPy 文档也是类型提示的良好资源

© www.soinside.com 2019 - 2024. All rights reserved.