我收到带有GPS数据的UDP数据包,并用它们构建Position对象。 有时,GPS丢失卫星信号,但仍然发送没有有价值数据的UDP数据包。我希望位置构造函数给我一个'无'在这种失败案件中的对象。所以,我可以检查是否处理该职位。这样的事情:
frameGPS = giveMeTheFrame()
position1 = Position(frameGPS)
if (position1 is None): don't process position1
else: process position1
这是一种正确的方法吗? 如果是这样,我怎么能实现这个 init ?
答案 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__
发布的答案也是一个非常好的选择!
提供另一种方法:
根据您对垃圾数据的评论以及被视为有效数据的评论。我们假设您收到有效字符作为坐标。为了简单起见:
N
,S
,E
,W
一种方法是,如果给出了无效数据以正确实例化该类的实例,那么您可以让您的类 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