Perhaps I'm going against idiomatic Python style, but I felt it clearer (i.e. less error-prone) to have separate methods. Consider the following where someone intends to stream MapReduce results, but forgets the flag:

```python
for phase, data in mr.run():
    # This may not even work! The result of mr.run() is a list of 
    # lists, which are not guaranteed to be pairs that can be 
    # destructured on assignment to the loop variables.
    print phase, data
```

Alternately, what if they expect the result to be a stream, but it's actually the synchronous version?

```python
for result in mr.run(stream=True):
    # This will work, but they're going to get (phase, data) tuples instead
    # of individual result lists.
    print result
````

The other option (which is what was recently done in Ruby, btw, for other reasons) is to assume all MapReduce operations are streamed, and then only collect results at the top level if stream=False.