On 5/18/2011 5:37 PM, Amaury Forgeot d'Arc wrote:
Hi,

2011/5/18 Terry Reedy<tjre...@udel.edu>:
On 5/18/2011 10:19 AM, Nadeem Vawda wrote:

I'm not sure why you would encounter code like that in the first place.
Surely any code of the form:

     ''.join(c for c in my_string)

would just return my_string? Or am I missing something?

Good question. Anything useful like "'-'.join(c for c in 'abc')" is the same
as "'-'.join('abc'). The same, as far as I can think of, for anything like
list() or set() taking an iterable arg.

With a little imagination you can build something non trivial.
For example, a join_words function:

def join_words(words):
     return ', '.join(w.strip() for w in words)

Like Victor says, the code of the generator object contains a
STORE_FAST followed by LOAD_FAST.
This pair of opcodes could be removed, and the value left on the stack.

dis.dis(join_words.func_code.co_consts[2])
   1           0 SETUP_LOOP              24 (to 27)
               3 LOAD_FAST                0 (.0)
         >>     6 FOR_ITER                17 (to 26)
               9 STORE_FAST               1 (w)
              12 LOAD_FAST                1 (w)
              15 LOAD_ATTR                0 (strip)
              18 CALL_FUNCTION            0
              21 YIELD_VALUE
              22 POP_TOP
              23 JUMP_ABSOLUTE            6
         >>    26 POP_BLOCK
         >>    27 LOAD_CONST               0 (None)
              30 RETURN_VALUE

As I pointed out in response to Victor, you get nearly the same with bytecode with regular old for loops; in particular, the store x/load x pair.

It's probably not easy to do though.
Think of expressions where the variable appears several times,
or even where the variable is not the first object, like str(ord(x)).

Where first means first in left-to-right order rather than in innermost to outermost order. (OT: I think Python is a bit unusual in this way.)

--
Terry Jan Reedy

_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to