在__init __

时间:2015-09-03 19:07:20

标签: python

如何在没有pylint的__init__中使用属性设置器,抱怨该属性已在__init__之外定义?

例如,以下代码仅生成一个异常,该异常在底部的try子句中捕获。

class CircleNotUsingSetterInInit(object):

    def __init__(self, radius):
        # Notice underscore in 'self.radius
        self._radius = radius

    @property
    def radius(self):
        return self._radius

    @radius.setter
    def radius(self, radius):
        if radius < 0:
            raise ValueError("Radius must be non-negative")
        self._radius = radius


class CircleUsingSetterInInit(object):

    def __init__(self, radius):
        # Notice lack of underscore in 'self.radius'
        self.radius = radius

    @property
    def radius(self):
        return self._radius

    @radius.setter
    def radius(self, radius):
        if radius < 0:
            raise ValueError("Radius must be non-negative")
        # From pylint:
        # Attribute '_radius' defined outside __init__ (attribute-defined-outside-init)
        self._radius = radius


CircleNotUsingSetterInInit(5)
CircleNotUsingSetterInInit(-1)
CircleUsingSetterInInit(5)
try:
    CircleUsingSetterInInit(-1)
except ValueError:
    print("caught exception")

我正在使用Python 2.7.10。

1 个答案:

答案 0 :(得分:3)

在这种情况下,警告完全可以忽略。 Pylint只是没有&#34;看到&#34;在没有进行语法分析的情况下,注意到这一点非常复杂。

您可以为pylint添加注释以在本地禁用此警告,如下所示:

class CircleUsingSetterInInit(object):

    # ....

    @radius.setter
    def radius(self, radius):
        if radius < 0:
            raise ValueError("Radius must be non-negative")
        # pylint: disable=W0201
        self._radius = radius

W0201attribute-defined-outside-init的代码,这是根据the docs收到的警告。您应该始终在尽可能靠近源的位置添加此类禁用注释,以便pylint对文件的其余部分正常工作。