Search code examples
python-3.xvariablespython-module

Why can't I access a variable that's being returned from a function?


I am new to Python and am at a lost as to what I'm doing wrong. I am trying to use the fqdn variable that is being returned to the caller which is main() but I'm getting NameError: name 'fqdn' is not defined

I'm betting this is some type of global variable statement issue or something like that, but I've been researching this and can't figure it out.

If a function from a module returns a value, and the caller is main(), shouldn't main() be able to use that returned value???

Here's the layout:

asset.py

def import_asset_list():
    # Open the file that contains FQDNs
    openfile = open(r"FQDN-test.txt")

    if openfile.mode == 'r':
        # Remove CR from end of each item
        fqdn = openfile.read().splitlines()

        # Add https to the beginning of every item in list
        fqdn = ["https://" + item for item in fqdn]        

        openfile.close()        

        return fqdn

tscan.py

def main():
    import asset
    asset.import_asset_list()

    # Iterate through list
    for i in fqdn:
        if SCHEDULED_SCAN == 1:
            create_scheduled_scan(fqdn)
            launch_scan(sid)
            check_status_scan(uuid)    
        else:
            create_scan(fqdn)
            launch_scan(sid)
            check_status_scan(uuid)

Solution

  • Short Explanation

    Yes, main() should be able to use the returned value, but it's only the value that is returned, not the variable name. You have to define a variable of your own name, to receive the value, and use that instead.

    Long Explanation

    The name of a variable inside any function is simply a "label" valid only within the scope of this function. A function is an abstraction which means "Give me some input(s), and I will give you some output(s)". Within the function, you need to reference the inputs somehow and, potentially, assign some additional variables to perform whatever it is you would like to. These variable names have no meaning whatsoever outside the function, other than to, at most, convey some information as to the intended use of the function.

    When a function returns a value, it does not return the "name" of the variable. Only the value (or the reference in memory) of the variable. You can define your own variable at the point where you call the function, give it your own name and assign to it the returned result of the function, so you simply have to write:

    def main():
        import asset
        my_asset_list = asset.import_asset_list()
    
        # Iterate through list
        for i in my_asset_list:
            if SCHEDULED_SCAN == 1:
                create_scheduled_scan(my_asset_list)
                launch_scan(sid)
                check_status_scan(uuid)    
            else:
                create_scan(my_asset_list)
                launch_scan(sid)
                check_status_scan(uuid)
    

    I don't know where the uuid and the sid variables are defined.

    To make sure you have understood this properly, remember:

    • You can have multiple functions in the same file, and use identically-named variables within all those functions, this will be no problem because a variable (with its name) only exists within each specific function scope.

    • Variable names do not "cross" the boundaries of the scope, only variable values/references and to do this, a special construct is used, i.e. the return [something] statement.