如何优雅的解决Python返回None调用问题
Python有个特点,就是语法太随意,这是个优点,同时也是缺点。比如同一个函数,可以返回任意类型,像下面这个例子,一会返回str类型,一会返回int类型:
def function(x):
if x=1:
return 'ok' # 返回str型
else :
return 0 #返回int
这就造成对返回值没法统一处理,典型的问题就是在正则处理re.search(),当匹配成功了,返回一个March对象,如果没有匹配成功,则返回None。当你再进行下一步处理,比如调用group时,程序就会出错。
import re
text = 'hello world'
res = re.search(r'(worldx)', text).group(1)
print(res)
Traceback (most recent call last):
File "test.py", line 4, in <module>
match = re.search(r'(worldx)', text).group(1)
AttributeError: 'NoneType' object has no attribute 'group'
因为re.search在'Hello world'中找不到worldx字符,所以返回了None,这样再调用group时,就会报错,从而造成程序崩溃。
当然,解决这类问题可以使用try except来捕获异常,让程序继续运行。
import re
text = 'hello world'
try :
res = re.search(r'(worldx)', text).group(1)
except:
pass
print(res)
但Python的代码一定要优雅,无法容忍这种蹩脚写法,于是有个聪明的程序员就想出来了另一个解决办法,即自定义一个新的类NoMatch,让其也有group方法,这样在主函数返回None的时候,通过or语句,调用NoMatch的group方法。
import re
class NoMatch:
@staticmethod
def group(i):
return ''
text = 'hello world'
res = (re.search(r'(worldx)', text) or NoMatch).group(1) # res=''
print(res)
是不是特别机智 ☺
同时也希望Python组委会下一版把类似的问题给优化一下!