> On Jan 19, 2020, at 12:57, Steven D'Aprano <st...@pearwood.info> wrote: > > On Sun, Jan 19, 2020 at 02:37:14PM -0500, David Mertz wrote: >> The "fluent interface" (https://en.wikipedia.org/wiki/Fluent_interface) is >> popular in many programming languages, including in the sort of >> "mini-language" Pandas, within portion. > > I can't speak about Pandas, but what the OP is expecting to do is not a > fluent interface. It's just method chaining. We do method chaining all > the time with immutable "value objects" like strings: > > result = mystring.upper().strip().center(width).encode('utf-8') > > and nobody blinks an eye or calls it unpythonic.
It’s not even immutable that’s the key thing here, but nonmutating. Even on mutable types, Python encourages you to chain up nonmutating operations. And it goes beyond linear chaining; you can compose any nonmutating method calls, function calls, operators, and comprehensions you want. And it only becomes unpythonic it if gets too complicated to eye-parse. But you can’t compose mutating method calls, you have to imperatively chain them up as separate statements. You can even see this in the OP’s problem. He didn’t want to mutate list(range(10)); that’s a garbage value. But he did want to get the value that’s list(range(10)) with the list [10] stuck on the end, and Python does make that trivial: list(range(10)) + [10] You might not want to do that if 10 is an arbitrarily large user-supplied value, because that extra copy could be a serious performance cost. But in most such cases the list is a serious performance cost in the first place, and you really just wanted to use the range itself as an Iterable and itertools.chain it. When you have a nonmutating algorithm, you usually can compose it up roughly the same way you would in Haskell; when you have an in-place algorithm you usually can write it as a chain of imperative statements roughly the same way you would in C. Python only gets in your way when you have a mishmash of the two where it would make sense to write confusing things like `lst.sort() + lst.remove(10)` or a comprehension that mutates as it goes. Good uses of that kind of mishmash do exist, but aren’t that common. _______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/CNXO2YF5PANA6MX6TJUETDA7YVFVANGN/ Code of Conduct: http://python.org/psf/codeofconduct/