Hi, Finally found the time to go through this discussion.
The first note that comes to mind is: Although it has already been pointed out more than once that positional arguments cannot follow keyword arguments, you both (Andrew and Vincent) keep giving examples such as # SYNTAX ERROR route('sms.receive', sender=r'\+44(?P<local_number>[0-9]+)$', Consumer) I believe the reason for that is the clash between the will to preserve the current `route(channel, consumer)` syntax, which is like the parallel `url(path_regex, view, **kw)` syntax, on one hand; and the instinct that the identifying parameters should be together, on the other hand. I think that the latter consideration prevails; unlike the kw parameters in url(), which are essentially parameters to the view, the kw parameters proposed for channel help select the consumer; and so they must be adjacent to the channel name -- and hence, the consumer must be the first argument. A second thought is about multiple keyword arguments: It isn't clear if more than one keyword argument is allowed, and if so, what should be the semantics of the combination. When thinking about routing, it is almost obvious that if there are many kw arguments, they must all match for the whole route to match. But when thinking about includes, a different consideration arises: How do I specify routing in an app which deals with several incompatible channels? For argument's sake, let's say I have an app which can handle SMS's, mails and websocket.connect's. I want it to handle all of these if they come from within my company -- so, based on partial phone number, sender domain and client IP addresses, respectively. Would I need to have the app's routing.py module include()'ed three times? Or would it make more sense to give include() kw parameters an "or" semantics -- that is, match as soon as one argument matches? I think both of these solutions are bad, and the only solution that makes sense is to allow a more complex structure of argument -- so that multiple kw args are all required to match, and for a disjunction of channels we use positional channel-spec args -- something like, include('my_app.routing', chan_spec('sms.receive', sender=r'\1212555(?:[0-9]{4})$'), chan_spec('mail.receive', sender=r'^(?:\W+)@my_org.com$), chan_spec('websocket.connect', remote_ip='^172.10'), ) where a set of kw parameters are considered to all belong to one implicit chan_spec. My 2 cents, Shai.