如何处理 R0915: Too many statements (69/50) (too-many-statements) in pylint?

Posted

技术标签:

【中文标题】如何处理 R0915: Too many statements (69/50) (too-many-statements) in pylint?【英文标题】:how to deal with R0915: Too many statements (69/50) (too-many-statements) in pylint? 【发布时间】:2021-11-16 07:28:48 【问题描述】:

我在 PyQt5 中有一个 Python 代码(带有多个图形项的 GUI)。如何缩短代码以适应每个函数推荐的 PEP8 50 语句?将图形项的定义分解为多个函数是否合适?

    def __init__(self, pulse_number, on_time, off_time, x, y, offset):
        self.offset = offset
        self.laser_pulse_n = pulse_number
        self.laser_on_time = on_time
        self.laser_off_time = off_time
        self.laser_x_loc = x
        self.laser_y_loc = y
        # set window properties
        self.setMinimumSize(QSize(250, 300))
        self.setWindowTitle("Laser settings")

        self.int_validator = QIntValidator()

        # LASER
        # Create pulse number label
        self.pulse_number_label = QLabel(self)
        self.pulse_number_label.setGeometry(QRect(10, 0, 80, 20))
        self.pulse_number_label.setText("Pulse n.:")

        # Create pulse number input box
        self.pulse_number_input = QLineEdit(self)
        self.pulse_number_input.setGeometry(QRect(60, 0, 40, 20))
        self.pulse_number_input.setText(str(self.laser_pulse_n))
        self.pulse_number_input.setValidator(self.int_validator)

        # Create laser on label...
        
        ...

        # Apply button
        self.validate_button = QPushButton(self)
        self.validate_button.setGeometry(QRect(10, 240, 230, 40))
        self.validate_button.setToolTip("Click to save settings")
        self.validate_button.setFont(QFont('Times', 20))
        self.validate_button.setText("Apply")
        self.validate_button.clicked.connect(self.validate_settings)

【问题讨论】:

PEP 8 没有对函数的长度提出任何建议。没有提到 50 条语句 - 这只是 pylint 作者的发明,与 PEP 8 无关。 【参考方案1】:

在我看来,有两种解决方案:您可以禁用此警告,因为 PyQT 有点强迫您像这样编写代码。在构造函数中定义每个属性会更清楚,如果创建子函数,无论如何都会收到attribute-defined-outside-init 警告。另一种解决方案是稍微重构并创建一个属性设置器或一个用于设置对象的函数。

例如,从这个开始:

        ...
        self.validate_button = QPushButton(self)
        self.validate_button.setGeometry(QRect(10, 240, 230, 40))
        self.validate_button.setToolTip("Click to save settings")
        self.validate_button.setFont(QFont('Times', 20))
        self.validate_button.setText("Apply")
        self.validate_button.clicked.connect(self.validate_settings)

到这里:

        ...
        self.validate_button = self.validate_settings


    @property
    def validate_button(self):
        return self.__validate_button

    @validate_button.setter
    def validate_button(self, validate_settings):
        self.__validate_button = QPushButton(self)
        self.__validate_button.setGeometry(QRect(10, 240, 230, 40))
        self.__validate_button.setToolTip("Click to save settings")
        self.__validate_button.setFont(QFont('Times', 20))
        self.__validate_button.setText("Apply")
        self.__validate_button.clicked.connect(validate_settings)

这样做的好处是可以在以后根据需要更改属性。

或者这个:

        ...
        self.validate_button = QPushButton(self)
        self.__init_validate_button()

    def __init_validate_button(self):
        self.validate_button.setGeometry(QRect(10, 240, 230, 40))
        self.validate_button.setToolTip("Click to save settings")
        self.validate_button.setFont(QFont('Times', 20))
        self.validate_button.setText("Apply")
        self.validate_button.clicked.connect(self.validate_settings)

允许保持类不可变

【讨论】:

以上是关于如何处理 R0915: Too many statements (69/50) (too-many-statements) in pylint?的主要内容,如果未能解决你的问题,请参考以下文章

scipy.stats.weibull_min.fit() - 如何处理右删失数据?

Jooq 一次将 one2one 和 one2many 关系数据插入到 2 个表中。如何处理问题和回滚

如何处理 Rails 中的嵌套表单?

如何处理 RoR 中的三向关联?

在片段之间切换时如何处理相机?

如何为 dosuserbundle 和 hwiauthbundle (ERR_TOO_MANY_REDIRECTS) 设置路由前缀