On Thu, Mar 17, 2016 at 4:04 AM, Marko Rauhamaa <ma...@pacujo.net> wrote: > Question: Could the generators define __repr__ so you wouldn't need to > terminate the pipeline with "List" in interactive use?
No no no no. You do NOT want __repr__ to fundamentally change the state of the object (which it would in that case - it'd consume the generator!). What you want instead is to change sys.displayhook, which affects *only* interactive use: $ python3 Python 3.6.0a0 (default:ae76a1046bb9, Mar 17 2016, 05:45:31) [GCC 5.3.1 20160224] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import sys, types >>> def displayhook(obj): ... if isinstance(obj, types.GeneratorType): ... obj = list(obj) ... print("(%r)" % obj) ... else: ... print(repr(obj)) ... __builtins__._ = obj ... >>> def gen(): ... yield 1 ... yield 2 ... yield 5 ... >>> gen() <generator object gen at 0x7ff541604af0> >>> sys.displayhook = displayhook >>> gen() ([1, 2, 5]) >>> _ [1, 2, 5] To be properly reliable, you'd want to import this function from another module, rather than create it interactively (imagine what happens if you shadow the built-in 'list'); and you might want to handle the conversion to concrete recursively (which __repr__ would have do automatically). But it's still a *lot* safer than messing around with repr! (By the way, I'd really love to be able to write "def sys.displayhook(obj):". But maybe that's more cute than truly useful.) ChrisA -- https://mail.python.org/mailman/listinfo/python-list