如何优雅的解决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组委会下一版把类似的问题给优化一下!

posted @ 2022-04-24 22:58  凤毛  阅读(1246)  评论(0编辑  收藏  举报