Python中的raise对象在哪里?
当你想在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))
。