【发布时间】:2014-02-15 06:13:52
【问题描述】:
假设你有一个函数可以返回一些对象或无:
def foobar(arg):
if arg == 'foo':
return None
else:
return 'bar'
现在你调用这个方法并且你想对对象做一些事情,对于这个例子我得到一个str,所以我可能想调用upper()函数。
现在有两种情况会发生,第二种会失败,因为 None 没有方法upper()
foobar('sdfsdgf').upper()
foobar('foo').upper()
当然,这现在很容易解决:
tmp = foobar('foo')
if tmp is not None:
tmp.upper()
# or
try:
foobar('foo').upper()
except ArgumentError:
pass
# or
caller = lambda x: x.upper() if type(x) is str else None
caller(foobar('foo'))
但是异常处理可能不够具体,并且可能会发生我捕获可能很重要的异常(= 调试变得更加困难),而第一种方法很好,但可能会导致更大的代码,而第三个选项看起来很很好,但你必须对所有可能的功能都这样做,所以方法一可能是最好的。
我想知道是否有任何语法糖可以很好地处理这个问题?
【问题讨论】:
-
你可以返回一个空字符串而不是'None'。
-
当然可以,但是假设我调用的函数是一个库并且我不想更改 API
-
你只能有一个语法方法,因为必须是一个调用:ret = foobar(arg); ret.upper() if ret else pass
-
@cox:
ret.upper()返回新字符串。而且你不能在条件表达式中使用pass。 -
我知道,就是例子;我不想用 [code][/code] 和缩进来回答它;泛型编程