gpt4 book ai didi

python - 我的代码嵌套太深。有没有更好的办法?

转载 作者:太空狗 更新时间:2023-10-29 22:09:34 36 4
gpt4 key购买 nike

这段代码是我最近在另一个问题中写的,我不确定它是否是最佳的。不过,我找不到缩进更少的方法。有吗?

def msg_generator(self):
''' Provides messages until bot dies '''
while self.alive:
for msg in self.irc.recv(self.buffer).split(('\r\n').encode()):
if len(msg) > 3:
try:
yield Message(msg.decode())
except Exception as e:
self.log('%s %s\n' % (except_str, str(e)))

我一直听说嵌套太多不好,但这似乎是必要的。目前有四个压痕深。

最佳答案

在我的脑海中,你可以这样做:

def msg_generator(self):
''' Provides messages until bot dies '''
while self.alive:
for msg in self.irc.recv(self.buffer).split(('\r\n').encode()):

if len(msg) <= 3:
continue

try:
yield Message(msg.decode())
except Exception as e:
self.log('%s %s\n' % (except_str, str(e)))

或者您可以重构为函数。

def msg_generator(self):
''' Provides messages until bot dies '''
while self.alive:
for msg in self.irc.recv(self.buffer).split(('\r\n').encode()):

if not len(msg) > 3:
continue

yield handle_message(msg)

def handle_message(msg):
try:
return Message(msg.decode())
except Exception as e:
self.log('%s %s\n' % (except_str, str(e)))

或者使用这样的东西:

from itertools import imap

def msg_generator(self):
''' Provides messages until bot dies '''
while self.alive:
it = iter(self.irc.recv(self.buffer).split(('\r\n').encode()))
return imap(handle_message, (msg for msg in it if len(msg) > 3)

def handle_message(msg):
try:
return Message(msg.decode())
except Exception as e:
self.log('%s %s\n' % (except_str, str(e)))

最后一个选项并不完美,因为如果有异常,那么 func 将返回 None 这不是真正的消息,所以你也可以在之后使用 filter() 过滤它 或让另一端处理 None 消息。

关于python - 我的代码嵌套太深。有没有更好的办法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19363527/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com