[PATCH 5/n] pwclient: allow multiple IDs
    Bernhard Reutner-Fischer 
    rep.dot.nop at gmail.com
       
    Mon Sep  8 20:14:48 EST 2014
    
    
  
[Please keep me in CC..]
On Fri, Aug 29, 2014 at 03:11:34PM +0000, Keller, Jacob E wrote:
>On Fri, 2014-08-29 at 11:07 +0200, Bernhard Reutner-Fischer wrote:
>> @@ -623,28 +630,29 @@ def main():
>>          action_states(rpc)
>>  
>>      elif action == 'view':
>> -        s = rpc.patch_get_mbox(patch_id)
>> -        if len(s) > 0:
>> -            print unicode(s).encode("utf-8")
>> +        for patch_id in patch_ids:
>> +            s = rpc.patch_get_mbox(patch_id)
>> +            if len(s) > 0:
>> +                print unicode(s).encode("utf-8")
>>  
>>      elif action in ('get', 'save', 'info'):
>>          if action == 'info':
>> -            action_info(rpc, patch_id)
>> +            [action_info(rpc, patch_id) for patch_id in patch_ids]
>>          else:
>> -            action_get(rpc, patch_id)
>> +            [action_get(rpc, patch_id) for patch_id in patch_ids]
>>  
>>      elif action == 'apply':
>> -        action_apply(rpc, patch_id)
>> +        [action_apply(rpc, patch_id) for patch_id in patch_ids]
>>  
>>      elif action == 'git-am':
>>          cmd = ['git', 'am']
>>          if do_signoff:
>>              cmd.append('-s')
>> -        action_apply(rpc, patch_id, cmd)
>> +        [action_apply(rpc, patch_id, cmd) for patch_id in patch_ids]
>>  
>>      elif action == 'update':
>> -        action_update_patch(rpc, patch_id, state = state_str,
>> -                commit = commit_str)
>> +        [action_update_patch(rpc, patch_id, state = state_str,
>> +                commit = commit_str) for patch_id in patch_ids]
>>  
>
>Since you aren't saving the array that you generate here, wouldn't it
>make more sense to just do:
>
>for patch_id in patch_ids:
>	action_update_patch(rpc, patch_id, state = state_str,
>		commit = commit_str )
>
>
>?
That's a style question i assume. I don't mind either way, please
follow-up if you prefer the for-loop variant.
>
>I don't see why you bother to actually create the array, (obviously you
>can't just use a generator expression since that won't be evaluated. I
>don't think you need to worry about catching the whole array here either
>if I understand correctly.
>
>I am not sure if Python will be smart enough to avoid creating the array
>in this case, though it probably doesn't really hurt anything...
One could argue that if python really builds a list then python should
be fixed ;)
But let's not speculate but simply see what it makes out of what i hastily
scribbled above:
$ cat sample.py
import dis
def consume(patch_id):
  """consume the arg, return nothing"""
def arr(patch_ids):
  [consume(patch_id) for patch_id in patch_ids]
def loop(patch_ids):
  for patch_id in patch_ids:
    consume(patch_id)
print("\n# arr")
dis.dis(arr)
print("\n# loop")
dis.dis(loop)
$ python2.7 ./sample.py 
# arr
  7           0 BUILD_LIST               0
              3 LOAD_FAST                0 (patch_ids)
              6 GET_ITER            
        >>    7 FOR_ITER                18 (to 28)
             10 STORE_FAST               1 (patch_id)
             13 LOAD_GLOBAL              0 (consume)
             16 LOAD_FAST                1 (patch_id)
             19 CALL_FUNCTION            1
             22 LIST_APPEND              2
             25 JUMP_ABSOLUTE            7
        >>   28 POP_TOP             
             29 LOAD_CONST               0 (None)
             32 RETURN_VALUE        
# loop
  9           0 SETUP_LOOP              24 (to 27)
              3 LOAD_FAST                0 (patch_ids)
              6 GET_ITER            
        >>    7 FOR_ITER                16 (to 26)
             10 STORE_FAST               1 (patch_id)
 10          13 LOAD_GLOBAL              0 (consume)
             16 LOAD_FAST                1 (patch_id)
             19 CALL_FUNCTION            1
             22 POP_TOP             
             23 JUMP_ABSOLUTE            7
        >>   26 POP_BLOCK           
        >>   27 LOAD_CONST               0 (None)
             30 RETURN_VALUE        
$ python3.4 ./sample.py 
# arr
  7           0 LOAD_CONST               1 (<code object <listcomp> at 0x7f4d1df55030, file "./sample.py", line 7>)
              3 LOAD_CONST               2 ('arr.<locals>.<listcomp>')
              6 MAKE_FUNCTION            0
              9 LOAD_FAST                0 (patch_ids)
             12 GET_ITER
             13 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             16 POP_TOP
             17 LOAD_CONST               0 (None)
             20 RETURN_VALUE
# loop
  9           0 SETUP_LOOP              24 (to 27)
              3 LOAD_FAST                0 (patch_ids)
              6 GET_ITER
        >>    7 FOR_ITER                16 (to 26)
             10 STORE_FAST               1 (patch_id)
 10          13 LOAD_GLOBAL              0 (consume)
             16 LOAD_FAST                1 (patch_id)
             19 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
             22 POP_TOP
             23 JUMP_ABSOLUTE            7
        >>   26 POP_BLOCK
        >>   27 LOAD_CONST               0 (None)
             30 RETURN_VALUE
So, if this really bothers you then please tweak it to use a for-loop.
I do not think that it makes a terrible lot of difference for the
use-case at hand though, performance-wise or memory-wise.
As said, if you dislike the coding style then please follow-up.
TIA && cheers,
    
    
More information about the Patchwork
mailing list