This has sort of devolved into a PyStan and RStan version 3 discussion, so I'll chime in with comments from @seantalts on pythonicism.
The reason he thought that having the compiled model behave as a functor over the parameters is that there's nothing else the compiled model does. Therefore, it should act like a simple function. I was thinking it was something deeper about when to use functors, constructors, or factory methods, etc. So here are the alternatives, none of which is more or less pythonic in general, just in the context of the functionality of that posterior object (really the compiled object code in some linkable form).
joint = StanModel("foo.stan")
1. posterior = joint(data) # functor
2. posterior = Posterior(joint, data) # constructor
3. posterior = joint.condition(data) # factory method
And I have to say that even though @seantalts told me that pattern-speak wasn't considered acceptable in Python, every discussion from the senior Python devs (like the ones who maintain the language) is riddled with pattern speak. I just watched this great video which is all about why you want to build a pythonic adapter pattern rather than accessing a non-pythonic lib in this
My favorite quote (and takeaway message) was "PEP-8 unto thyself, do not PEP-8 unto others." I'm going to try to take that more to heart in code reviews in C++. It also implicitly went through a number of Python idioms without getting all preachy about it (OK, it was super preachy, but not in a condescending sort of way); it drove me crazy that nobody saw the typo on
"commit" he introduced and apparently I wasn't the only one judging from the comments on YouTube.