Gabriel Staples Gabriel Staples - 3 months ago 17
Python Question

Python NameError: name is not defined (related to having default input argument types)

I have a problem with the fact that I am calling

len(myByteArray)
in the input arguments to a function I am declaring. I'd like that to be a default argument, but Python doesn't seem to like it.
myByteArray
is of type
bytearray
. See documentation on bytearray here. I am accessing its built-in
find
function, documented here (see "str.find").

My function:

def circularFind(myByteArray, searchVal, start=0, end=len(myByteArray)):
"""
Return the first-encountered index in bytearray where searchVal
is found, searching to the right, in incrementing-index order, and
wrapping over the top and back to the beginning if index end <
index start
"""
if (end >= start):
return myByteArray.find(searchVal, start, end)
else: #end < start, so search to highest index in bytearray, and then wrap around and search to "end" if nothing was found
index = myByteArray.find(searchVal, start, len(myByteArray))
if (index == -1):
#if searchVal not found yet, wrap around and keep searching
index = myByteArray.find(searchVal, 0, end)
return index


Examples to attempt to use the function above:

#-------------------------------------------------------------------
#EXAMPLES:
#-------------------------------------------------------------------
#Only executute this block of code if running this module directly,
#*not* if importing it
#-see here: http://effbot.org/pyfaq/tutor-what-is-if-name-main-for.htm
if __name__ == "__main__": #if running this module as a stand-alone program
import random
random.seed(0)

bytes = bytearray(100)
for i in range(len(bytes)):
bytes[i] = int(random.random()*256)

print(list(bytes)); print();

print('built-in method:')
print(bytes.find(255))
print(bytes.find(2,10,97))
print(bytes.find(5,97,4))

print('\ncircularFind:')
print(circularFind(bytes,255))
print(circularFind(bytes,2,10,97))
print(circularFind(bytes,5,97,4))


Error:


NameError: name 'myByteArray' is not defined


If I just remove my default arguments (
=0
and
=len(myByteArray)
), however, it works fine. But...I really want those default arguments there so that the
start
and
end
arguments are optional. What do I do?

In C++ this would be easy, as argument types are specified when you write functions.

Answer

Python default arguments are evaluated when the function is defined. Rather, you want something like this:

def circularFind(myByteArray, searchVal, start=0, end=None):
    """
    Return the first-encountered index in bytearray where searchVal 
    is found, searching to the right, in incrementing-index order, and
    wrapping over the top and back to the beginning if index end < 
    index start
    """
    if end is None:
        end = len(myByteArray)
    # continue doing what you were doing