给出object或None的python条件构造函数

时间:2017-07-05 02:08:26

标签: python

我收到带有GPS数据的UDP数据包,并用它们构建Position对象。 有时,GPS丢失卫星信号,但仍然发送没有有价值数据的UDP数据包。我希望位置构造函数给我一个'无'在这种失败案件中的对象。所以,我可以检查是否处理该职位。这样的事情:

frameGPS = giveMeTheFrame()
position1 = Position(frameGPS)
if (position1 is None): don't process position1
else: process position1

这是一种正确的方法吗? 如果是这样,我怎么能实现这个 init

2 个答案:

答案 0 :(得分:2)

正如coldspeed所说,你不能从__init__返回。你可以做的是将对象初始化为"空"州。让你的Position对象执行类似的操作。

class Position:
    def __init__(self, frame):
        if some_condition:
            self.okay = True
            # Success; load the frame data into Position ...
        else:
            self.okay = False
    def __bool__(self):
        return self.okay

然后你可以像你想要的那样在if语句中使用它。

frameGPS = giveMeTheFrame()
position1 = Position(frameGPS)
if position1:
    # Success; do some work ...
else:
    # Failure; GPS lost signal ...

请注意,在Python 2.x中,相关方法称为__nonzero__(),而不是__bool__()。因此,如果您使用的是Python 2.x,请使用__nonzero__(),如果您使用的是Python 3.x,请使用__bool__()

答案 1 :(得分:2)

有不同的方法可以解决这个问题。通过实施__bool__发布的答案也是一个非常好的选择!

提供另一种方法:

根据您对垃圾数据的评论以及被视为有效数据的评论。我们假设您收到有效字符作为坐标。为了简单起见:

NSEW

一种方法是,如果给出了无效数据以正确实例化该类的实例,那么您可以让您的类 raise

def Position:
    def __init__(self, position):
        if position.upper() not in {'N', 'S', 'E', 'W'}:
            raise InvalidPositionData('Received unexpected data {}'.format(position))
        self.position = position

在您的代码中,您可以简单地换行以捕获该异常:

frameGPS = giveMeTheFrame()
try:
    position1 = Position(frameGPS)
except InvalidPositionData as exc:
    # do things with your exception here
    log.error('something bad happened')
# continue with logic here