Python中的raise对象在哪里?

0 投票
4 回答
1415 浏览
提问于 2025-04-16 04:15

当你想在Python中打印一堆变量时,有很多种方法可以选择,比如:

for i in range(len(iterable)):
    print iterable[i].name

或者

map(lambda i: sys.stdout.write(i.name), iterable)

我在第二个例子中使用sys.stdout.write而不是print的原因是,lambda表达式不支持print,但sys.stdout.write可以达到同样的效果。

你还可以使用三元运算符进行条件打印:

map(lambda n: None if n % 2 else sys.stdout.write(str(n)), range(1, 100))

如果我能检查整个序列,看看是否有条件需要抛出异常,那就太方便了,像这样:

map(lambda o: raise InvalidObjectError, o.name if not o.isValid else o(), iterable)

但是这样不行。 在Python中有没有类似于raise的对象,如果有的话,它在哪里呢?

4 个回答

1

不要这样做。

这是个糟糕的主意。

map(lambda o: raise InvalidObjectError, o.name if not o.isValid else o(), iterable)

这样做。

class SomeValidatingClass( object ):
    def isValid( self ):
        try: 
            self.validate()
        except InvalidObjectError:
            return False
        return True
    def validate( self ):
        """raises InvalidObjectErorr if there's a problem."""

[ x.validate() for x in iterable ]

没有映射。没有匿名函数。效果一样。

2

我觉得在 lambda 表达式里用 raise 是不太可能的,因为 raise 是一个语句,不是一个对象。正如 @Alex Martelli 所说,你可能需要定义一个函数来帮你进行检查。这个函数可以在同一个地方定义,也就是在你需要用到它的上下文中。

至于异常类型,你的问题似乎是想问这个:异常类型并不是自动定义的。对于简单的异常类型,如果你只想要一条文本信息,或者根本不想要,通常情况下,异常类型会在你的模块或文件的范围内简单地定义为:

class InvalidObjectError(Exception): pass
4

在Python中,没有现成的“对象”(无论是内置的还是标准库里的)可以用来处理raise,你需要自己创建一个(通常会把这个小代码片段放在自己的util.py文件里):

def do_raise(exc): raise exc

通常会这样调用:do_raise(InvalidObjectError(o.name))

撰写回答