滥用收益率

时间:2015-07-21 15:23:02

标签: python yield

我正在制作一个需要能够处理大量命令的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))

但这种方式感觉不太好。

1 个答案:

答案 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)。通过这种方式,您可以保留原始数据,并可以立即开始处理函数

之外的值