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

推荐答案

皮查姆的建议是正确的.事实上,我认为以下代码更好:

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__,永远不要返回值.

谢谢

Python-3.x相关问答推荐

如果行在所有上级索引中都为0,如何删除下级索引行?

切片时是否在NumPy ND数组中创建新对象?

从另一个云函数调用带有仅允许内部流量标志的云函数时出现问题

如何通过 python 使用 auth no priv 获取 SNMPv3?

如何计算Pandas 列中每列唯一项目的出现次数?

Python:如何从句子/段落中提取地址(非正则表达式方法)?

Pandas 值列中列表中元素的计数

如何准确测定cv2的结果.在BW/黑白图像中查找对象?

python用户输入5个偶数并打印最大的

ImportError:没有名为资源的模块

例外:使用 Pyinstaller 时找不到 PyQt5 插件目录,尽管 PyQt5 甚至没有被使用

如何将具有多个参数的函数传递给 python concurrent.futures.ProcessPoolExecutor.map()?

命名元组内命名元组的 Python 语法

两个Pandas数据框中的共同列列表

如何禁用 pylint 禁止自用警告?

if 语句中冒号的语法错误

如何遍历某些扩展名的文件?

Python 3 中的连接列表

带有 Emacs 的 Python 3

SQLALCHEMY_DATABASE_URI 未设置