2015-09-03 160 views
1

如何在沒有pylint的情況下在__init__中使用屬性設置器,抱怨該屬性已被定義在__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。

+0

'CircleUsingSetterInInit'是正確的行爲,您可以隨意忽略這個「pylint」,或者使用內聯註釋將其關閉。 – jonrsharpe

回答

3

在這種情況下,警告是完全安全的。 Pylint並沒有「看到」,注意到沒有進行語法分析就相當複雜。

您可以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對文件的其餘部分正常工作。

+2

請注意,您可以使用'disable = attribute-defined-outside-init',這意味着讀者不需要查看代碼! – jonrsharpe

+0

@jonrsharpe,哦是的,因爲pylint v0.25.3我相信 – WorldSEnder

+0

沒錯:http://docs.pylint.org/faq.html#do-i-have-to-remember-all-these-numbers – jonrsharpe