[Tutor] variable existence q

Mark Lawrence breamoreboy at yahoo.co.uk
Sun Aug 16 01:05:16 CEST 2015


On 15/08/2015 23:38, Clayton Kirkwood wrote:
> top_directory = "/users/Clayton/Pictures"
> target_directory = top_directory      #directory we are checking
> filetypes = ('jpg', 'png', 'avi', 'mp4', 'mov', 'bmp')
>
> imports...
>
> def override_defaults():
>      with open( user_preferences ) as f:
>          for line in f.readline():
>              llist = line.split()
>              if llist[0] == '#':   #comment line to ignore
>                  continue
>              elif llist[0] == 'top_directory':
>                  if len(llist) == 1:
>                      pass
>                  else:
>                      top_directory = llist[1]
>              elif llist[0] == 'target_directory':
>                  if len(llist) == 1:
>                      pass
>                  else:
>                      target_directory = llist[1]
>              else:       #assume only filetypes now or until next comment or
> other keyword
>                  if llist[0] == 'filetypes': #allow keyword w/wo following
> types
>                      if llist.length() == 1:
>                          continue     #assume user plans either not
> interested in types or types coming on later line
>                      llist.pop([0])          #skip keyword and start
> recording
>                  filetypes.append(llist[0:]) #assume line contains 0,
> consumes blank lines, or more media files w/wo leading dot
>              continue
> 56    return( top_directory, filetypes, target_directory )
> 80 top_directory, filetypes, target_directory = override_defaults()>
>
> The error message again is:
>    File "C:/Users/Clayton/python/find picture duplicates/find picture
> duplicates", line 80, in <module>
>      top_directory, filetypes, target_directory = override_defaults()
>    File "C:/Users/Clayton/python/find picture duplicates/find picture
> duplicates", line 56, in override_defaults
>      return( top_directory, filetypes, target_directory )
> UnboundLocalError: local variable 'top_directory' referenced before
> assignment
>
>>> Your explanation doesn't make any sense to me.  I'd have thought that
>>> having assigned top_directory at line 10, but then trying to reassign
>>> it at line 80, means that the function now knows nothing about it,
>>> hence the error.
>>
>> Assigning to a variable inside a function makes that variable local, which
> must
>> have happened as per the error message:
>>       UnboundLocalError: local variable 'top_directory'...
>>
>> As Peter noted, somewhere within override_defaults there's an assignment
>> to it.  Changing to
>>      def override_defaults(top_directory=top_directory):
>> should initialize it in case the assignment path isn't processed.
>
> Above is the actual code. The file /user..../user preferences exists but is
> empty. Defaults are at the top. For what it is worth, the debugger stopped
> in the function shows the values stated as the defaults at the top. If I
> understand correctly, the readline() would drop out, but even if it doesn't
> no assignments would be made for top_directory or target_directory. I
> thought that top_directory was global to this file. I am hearing that it
> doesn't matter whether the assignment is above or below the function
> definition. I should be able to use the tuple for the results of the call,
> right? In this case, no assignment was made. If I understand, the function
> sees the global. If that is changed inside the function, doesn't it change
> the global?
>
> Crk

You are trying to change it at line 80.  Do you really want to do that? 
  If no I suggest you spell it TOP_DIRECTORY to indicate that it is a 
constant that should not be changed.

-- 
My fellow Pythonistas, ask not what our language can do for you, ask
what you can do for our language.

Mark Lawrence



More information about the Tutor mailing list