Cameron, Thank you again for the insight.
Yes, data_out is an equivalently-sized 'chunk' of a larger array. I'm 'getting' this now.. So, without all the fluff associated with wiggling lines, my function now looks like this: def RSI_size_the_loop(): results = [] all_together = [] # not certain if I need this, put it in in an attempt to fix the incompatibility if it existed for x in range (0, MAX_LOOP_COUNT, slice_size): results.append(my_transfer(disp, data_out, slice_size) print " results ", x, " = ", results # show how results grows on each iteration all_together = bytearray().join(results) print " all together ", all_together I can observe results increasing in size and the last time through the loop: results 48 = [[bytearray(b'\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')], [bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')], [bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')], [bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')]] So, now when I hit the line: all_together = bytearray().join(results) I'm getting the Traceback : Traceback (most recent call last): File "SW8T_5.py", line 101, in <module> # this is my main script loop_size = RSI_size_the_loop(Print) File "/home/temp/Python_Scratch/examples/RSI.py", line 359, in RSI_size_the_loop all_together = bytearray().join(results) TypeError: can only join an iterable of bytes (item 0 has type 'list') I looked this up, and there's very few search engine results on this type of TypeError. I wanted to clarify my understanding of iterable, and looked that up here: https://infohost.nmt.edu/tcc/help/pubs/python/web/iterable.html And, as far as I can tell I'm using a compatible sequence type. I've even added in print statements for the types, so I could double check, and I get: results returns <type 'list'> all_together returns <type 'list'> So both are type 'list' which is referred to here : https://infohost.nmt.edu/tcc/help/pubs/python/web/sequence-types.html as a valid sequence type but apparently there's a detail I'm still missing... On Mon, Sep 10, 2018 at 5:22 AM, Cameron Simpson <c...@cskk.id.au> wrote: > On 09Sep2018 23:00, Chip Wachob <wach...@gmail.com> wrote: >> >> On Sat, Sep 8, 2018 at 9:14 PM, Cameron Simpson <c...@cskk.id.au> wrote: >>> >>> Actually he's getting back bytearray instances from transfer and wants to >>> join them up (his function does a few small transfers to work around an >>> issue with one big transfer). His earlier code is just confused. So he >>> wants: >>> >>> bytearray().join(results) >>> >>> Hacked example: >>> >>> >>> bytearray().join( (bytearray("foo"),bytearray("bah")) ) >>> bytearray(b'foobah') >> >> >> I understand this example and I can replicate it in the interpreter.. >> >> But, I'm still missing something here. >> I presume that I need to instantiate an array of slice_size-sized >> bytearrays. > > > But no! > >> So, when I'm looping through, I can do: >> for i in range (0, slice_count): >> results[i] = spi.transfer(data_out) > > > Python lists are a variable size data structure, so our example goess: > > results = [] > > which allocates an empty list. Then: > > for i in range(slice_count): > results.append(spi.transfer(data_out)) > > suitably adjusted (data_out will be different pieces of the larger data, > yes?) which grows the array by one item with each append. Your spi.transfer > function allocates a new bytearray for each return value, so you end up with > a list of distinct bytearrays. > >> Then I can : >> >> all_together = butearray().join(results) > > > Yes. > >> But I can't seem to be able to find the proper syntax to create the >> initial array. >> And any attempt at filling the arrays to test some stand-alone code >> only give me errors. > > > You _can_ allocate a presized list, but there's almost no benefit and it > isn't what people normally do. > >> Here's my code (all of it) > > [...] >> >> #results = bytearray( (bytearray(slice_size)*slice_count) ) >> results = bytearray(slice_size) # why isn't this 16 bytes long? > > > It is 16 bytes long when I do it: > > >>> bs=bytearray(16) > >>> bs > > bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') > >> res_list = (results)*slice_count > > > This is a single 64 byte bytearray. You may have intended to make a single > element tuple with "(results)", but that is just the same as "results" > (rundundant brackets). To make a single element tuple you go "(results,)" - > see the trailing comma? > > Example of each: > > >>> bs*16 > > bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') > >>> (bs,)*16 > > (bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), > bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), > bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), > bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), > bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), > bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), > bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), > bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), > bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), > bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), > bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), > bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), > bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), > bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), > bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'), > bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')) > > But you don't need any of that. > > First, the list "results" can start empty and just get things appended to it > and second, you don't need to preallocate any bytearrays because the > internal, primary, transfer allocates a new bytearray for each return chunk. > > Cheers, > Cameron Simpson <c...@cskk.id.au> _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor