在Python中使用单元化变量

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)


Joh*_*ooy 6

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)