The code that generates the completions [1] and displays them [2] is fairly simple. It uses a mix of scanning for a function's docstring, Python's built-in rlcompleter module [3] to generate the possible identifiers and keywords, its own module scanner for imports [4].
[1] https://bitbucket.org/bobf/bpython/src/2b3fb2cb6500/bpython/...
[2] https://bitbucket.org/bobf/bpython/src/2b3fb2cb6500/bpython/...
[3] http://docs.python.org/library/rlcompleter.html
[4] https://bitbucket.org/bobf/bpython/src/2b3fb2cb6500/bpython/...