Flask [1] has similarities and IIRC the author of Flask, Armin Ronacher, has in the past proposed merging it with Bottle. However, the single file and dependencies thing is where the author of each framework disagrees.
Flask has tools that help with structuring larger apps and seems to be more widely used than Bottle.
Personally, I prefer bottle for things I know will remain small, just for the lack of dependencies and that I personally find the documentation easier to read.
It's not in Python, but I also really like the tiny Camping framework in Ruby. It's tiny enough and well documented enough that you can read and (more or less) understand the whole thing, even if you're not great at Ruby.
My path when learning web development kind of went from Camping to Sinatra to Rails, with periodic detours to Flask. The high level concepts are very similar.
CherryPy:
Mako:
It's quite easy to pick-up and does the job very well. It supports running directly over http, but you can also run it in wsgi or fastcgi modes without issues.
And it's also quite stable in term of APIs, my projects are now 4 years old, and I didn't have any breaking changes in their API. It makes it quite easy to support various distributions and version without kludges in the code to handle different versions or having to bundle cherrypy with the application. Even my monkey patches of the framework (slight change in the configuration parser) are not breaking ^^.
First app is a web config interface on a Raspberry Pi-based IoT device. Web config app will be almost identical server-side so as to allow config from anywhere. I was going to do it all in CGI but this is much improved.
However, it should be noted that TCL is famous for being a language that can be described in 12 rules:
And the tutorial is really good:
https://www.tcl.tk/man/tcl8.5/tutorial/tcltutorial.html
Obviously, there's a lot more online reference material and a bigger community for Python, but if you are interested in learning TCL, don't be afraid to go for it.
It's a framework that allows you to start with a single file, but also allows you to more logically then split your application up and grow with a huge amount of plug-ability while providing many sane defaults to start off with.
It is not a batteries included framework, so it gives you the flexibility to figure out what is best for your application vs being forced into a certain convention.
Full disclosure: I am a maintainer for the Pylons Project with a focus on: Pyramid, WebOb and waitress.
(To me, that's a plus)