This seems like a pretty special-case method, used just for support of `bisect()`, but I actually prefer its behavior over `__find_queue__()`. I also really dig the overall structuring of this: its use of fetching_queue is elegant. Let me bounce a refactoring off you:

What if, instead of raising `KeyError` for empty buckets, we arranged for an empty iterable? I think that would be much more amenable to functional composition than raising an exception. For example, you could do…

```python
squares_of_odds = (x*x for x in buckets(a_bunch_of_ints, lambda y: y % 2)[1])
for s in squares_of_odds:
    ...
```

…without worrying about whether there were actually any odd ints in `a_bunch_of_ints`. No need to define an exception handler: the `for` loop just happily does nothing. If we did that, the last line of `bisect` would become simply `return queues[False], queues[True]`, which I think is even more readable. What do you think?

I'm also tempted to somehow rig it so bucket's `queues` can optionally be a list rather than a dict. Do that, define a  `__getitem__` that understands slice objects, and you have a generalized `sect` that isn't necessarily `bi`. Here's a sketch of a trisection:

```python
good, bad, ugly = bucket_list(things, lambda x: 2 if x is None else 1 if x else 0)[:3]
```

But that's another story, I haven't thought it out very well yet, and it should wait till we get the map-based version merged.