pap*_*cut 4 python initialization pylint
背景:我有一个用寄存器建模芯片的类,芯片有一堆寄存器,其中一个是内置温度传感器的高温限制.
我有以下内容:
class foo():
def __init__(self):
# does not set self._hiTemp!
...
def setHiTemp(self, t):
self._hiTemp = t
def getHiTemp(self):
return self._hiTemp
def checkHiTemp(self):
return self._temp > self._hiTemp
Run Code Online (Sandbox Code Playgroud)
我不申报的原因self._hiTemp在__init__是因为用户可能不关心芯片的温度感测功能.用户可以以不同的方式使用芯片,并且赋予该变量无意义的值没有意义.但是,如果用户在self._hiTemp没有先设置的情况下尝试使用,则使用未声明变量的错误比一些模糊错误(如比较数字和无(或者在某些情况下甚至根本没有错误)更容易调试/回溯).
这一切都很好,直到我开始pylint,当然我得到W0201:在init之外定义的属性几乎无处不在.我只是想知道这种编码风格是否令人不满,如果是这样,"Pythonic方式"是什么.
谢谢
Joe*_*way 11
我这样做的方法是将其设置为None或者其他一些不会在"自然界"中出现的哨兵值.然后,对于需要设置它的操作,assert如果调用者试图不恰当地使用您的对象,请使用快速失败.
def __init__(self):
self._hiTemp = None
def checkHiTemp(self):
assert self._hiTemp is not None, 'Why you no set _hiTemp before checking it?'
return self._temp > self._hiTemp
Run Code Online (Sandbox Code Playgroud)
Python不是Java,所以不要写那样的getter和setter.你可以像这样解决你的问题
class Foo(object):
def __init__(self, hiTemp=None):
self._hiTemp = hiTemp
@property
def hiTemp(self):
if self._hiTemp is None:
raise AttributeError("You have not initialized hiTemp")
return self._hiTemp
@hiTemp.setter
def hiTemp(self, value):
self._hiTemp = value
def checkHiTemp(self):
return self._temp > self._hiTemp
foo=Foo()
foo.hiTemp = 50
print foo.hiTemp # Prints 50
foo=Foo(hiTemp=20)
print foo.hiTemp # Prints 20
foo=Foo()
print foo.hiTemp # Raises exception
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2165 次 |
| 最近记录: |