我正在制作一个需要能够处理大量命令的SocketServer。因此,为了防止我的RequestHandler变得太长,它将根据命令调用不同的函数。我的困境是如何让它将信息发送回客户端。
目前,我正在使这些功能“收益”它想要发送回客户端的所有内容。但我认为这可能不是pythonic方式。
# RequestHandler
func = __commands__.get(command, unkown_command)
for message in func():
self.send(message)
# example_func
def example():
yield 'ip: {}'.format(ip)
yield 'count: {}'.format(count)
. . .
for ping in pinger(ip,count):
yield ping
这是对收益率的丑陋使用吗?我能想到的唯一替代方案是,当RequestHandler调用函数时,它将自身作为参数传递
func(self)
然后在函数
中def example(handler):
. . .
handler.send('ip: {}'.format(ip))
但这种方式感觉不太好。
答案 0 :(得分:1)
def example():
yield 'ip: {}'.format(ip)
yield 'count: {}'.format(count)
在这个解决方案中,令我感到奇怪的不是yield
本身的使用(这可能是完全有效的),而是因为您过早地将数据转换为字符串而丢失了大量信息
特别是,对于这种数据,只需返回字典并在调用者中处理发送似乎更具可读性:
def example():
return {'ip': ip, 'count': count}
这也可以帮助您分离内容和表示,如果您希望,例如,返回以XML编码但后来切换到JSON的数据,这可能很有用。
如果要产生中间数据,另一种可能是使用元组:yield ('ip', ip)
。通过这种方式,您可以保留原始数据,并可以立即开始处理函数