Gabriel Staples Gabriel Staples - 1 year ago 71
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 Source

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