python条件构造函数,用于指定对象或无

python条件构造函数,用于指定对象或无,python,Python,我接收带有GPS数据的UDP数据包,并用它们构造位置对象。 有时,GPS会丢失卫星信号,但仍然发送UDP数据包,而没有任何有价值的数据。在这种失败的情况下,我希望Position构造函数给我一个“None”对象。因此,我可以检查是否处理该位置。诸如此类: frameGPS = giveMeTheFrame() position1 = Position(frameGPS) if (position1 is None): don't process position1 else: process p

我接收带有GPS数据的UDP数据包,并用它们构造位置对象。 有时,GPS会丢失卫星信号,但仍然发送UDP数据包,而没有任何有价值的数据。在这种失败的情况下,我希望Position构造函数给我一个“None”对象。因此,我可以检查是否处理该位置。诸如此类:

frameGPS = giveMeTheFrame()
position1 = Position(frameGPS)
if (position1 is None): don't process position1
else: process position1
这样做对吗?
如果是这样,我如何实现这个init

正如coldspeed所说,您不能从
\uuuu init\uuuu
返回。您可以做的是将对象初始化为“空”状态。让您的
位置
对象执行类似操作

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 ...

注意,在Python2.x中,调用的是相关的方法,而不是。因此,如果您在Python2.x中,请使用
\uuuuu nonzero\uuuuu()
,如果您在Python3.x中,请使用
\uuuu bool\uuu()
,正如coldspeed所说,您不能从
\uu init\uuuuuu
返回。您可以做的是将对象初始化为“空”状态。让您的
位置
对象执行类似操作

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 ...

注意,在Python2.x中,调用的是相关的方法,而不是。因此,如果您在Python2.x中,请使用
\uuuu nonzero\uuuu()
,如果您在Python3.x中,请使用
\uuu bool\uuu()
有不同的方法可以实现这一点。刚刚通过实现
\uuu bool\uuu
发布的答案也是一个非常好的选择

为了提供另一种方法:

根据您对垃圾数据和有效数据的评论。假设您接收到有效字符作为坐标。为了简单起见:

N
S
E
W

一种方法是,如果为类提供了无效数据以正确实例化该类的实例,则可以提升该类:

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

有不同的方法可以实现这一点。刚刚通过实现
\uuu bool\uuu
发布的答案也是一个非常好的选择

为了提供另一种方法:

根据您对垃圾数据和有效数据的评论。假设您接收到有效字符作为坐标。为了简单起见:

N
S
E
W

一种方法是,如果为类提供了无效数据以正确实例化该类的实例,则可以提升该类:

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

您不能从
\uuuu init\uuuu
返回任何内容。你最好的办法是在
\uuuu init\uuuu
中引发一个异常,应该在你的主代码中捕获并处理该异常。
giveMeTheFrame()
返回什么来指示你丢失了卫星信号?如果帧正常,帧将以我与regexSo核对的方式显示N或S(北或南)和E或W(东或西),如果它是无用的数据,它将返回一个空字符串?或者没有?在无用数据的情况下,我会收到大量零(垃圾),您无法从
\uuuu init\uuuu
返回任何内容。你最好的办法是在
\uuuu init\uuuu
中引发一个异常,应该在你的主代码中捕获并处理该异常。
giveMeTheFrame()
返回什么来指示你丢失了卫星信号?如果帧正常,帧将以我与regexSo核对的方式显示N或S(北或南)和E或W(东或西),如果它是无用的数据,它将返回一个空字符串?或者没有?在无用数据的情况下,我会收到大量的零(垃圾),我强烈要求对类似的异常使用谨慎。Python中的异常与许多语言中的异常一样,是为异常情况而保留的,而不是为正确的程序行为。但是在定义某项内容的契约时,使用异常处理允许您在本例中定义为异常的内容上设置边界。如果您的程序获取某一系列特定数据,你要确保这些数据保存在合同中,你要确保通过向打电话的人“提出”为什么他们的电话不起作用来清楚地解释这一点。因此,如果提供了无效的输入,那么以某种定制的
InvalidData
异常的形式相应地引发该异常是完全可以的。Python中的异常与许多语言中的异常一样,是为异常情况而保留的,而不是为正确的程序行为。但是在定义某项内容的契约时,使用异常处理允许您在本例中定义为异常的内容上设置边界。如果您的程序获取某一系列特定数据,你要确保这些数据保存在合同中,你要确保通过向打电话的人“提出”为什么他们的电话不起作用来清楚地解释这一点。因此,如果提供了无效输入,则可以以某种自定义
InvalidData
exception的形式相应地引发该异常。