As per this Question's accepted answer, I understand I cannot create pure global variables. Okay, cool.
However, he then goes on and says:
[..]all you can do is make a variable in a particular scope. (If you make a variable inside the Python interpreter, and then import other modules, your variable is in the outermost scope and thus global within your Python session.[..]
Okay, so we can't assign globals in the original sense, but it appears to be possible to access variables in the outermost scope from within a package, via the global keyword, correct?
I am then, apparently, missing something crucial in my efforts to access a variable passed to my python program via commandline arguments.
My program has the usual __main__.py, which handles argument parsing and executes code from my python module backend.
backend has code that relies on input via command line arguments. However, I seem to fail at making these arguments available to backend.
My package's layout is:
mypackage
- __main__.py
- backend/
-__init__.py
-direction.py
Here's __main__.py:
import argparse
# Setup ArgParser
parser = argparse.ArgumentParser(description="Fancy Description of program.")
parser.add_argument('--tar', nargs=1, dest='target',
help='Specify output folder.',
default=['/path/to/output'])
target_dir = args.target[0]
# Import backend now that our variable is set.
from backend.direction import direction
And my backend/direction.py:
global target_dir
print(target_dir)
Running this raises a NameError: 'target_dir' is not defined.
So where's the poop ?
Am I assuming an impossibility here, or am I simply messing up on declaration?
global, it means that the variable is defined somewhere in the outer scope. It will not be visible to other modules. (Every file you create is a module, in Python). So, you need to explicitlyimportthe module to access the variable.__main__in mydirection.py? That doesn't sound pretty, nor like something that should be done(?). Is it acceptable to load variable from a file as a workaround, instead?target_dirinto whatever functions actually need it. If there are many, consider using a class.globalkeyword, somehow.target_diris passed to almost all my functions, so I suppose I wanted to work around having to type it for each call - but I see how the suggestions and answers here make it clear whyglobalis nonesense for this undertaking.