Accessing a variable from outer scope via global keyword in Python

De openkb
Aller à : Navigation, rechercher

Sommaire

Questions

http://stackoverflow.com/questions/1977362/how-to-create-module-wide-variables-in-python http://stackoverflow.com/questions/1977362/how-to-create-module-wide-variables-in-python

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?

Answers

global only works within the module it s used in. You also don t use global to declare a global variable at the global scope (ie. the module scope). You would use global within the scope of a function to indicate that you want to use a variable in the global scope and not in the local scope.

In python 3, there is also the nonlocal keyword that allows you to indicate you want to modify a variable in an outer scope that isn t the global/module scope .

  global   
A = 1

def global_func():
    global A
    A = 2


def func():
    A = 3


print(A)
# 1

global_func()
print(A)
# 2

func()
print(A)
# 2
  nonlocal   
def outside():
    a = 1

    def inside_nonlocal():
        nonlocal a
        a = 2

    def inside():
        a = 3

    print(a)
    # 1

    inside_nonlocal()
    print(a)
    # 2

    inside()
    print(a)
    # 2

Source

License : cc by-sa 3.0

http://stackoverflow.com/questions/37743773/accessing-a-variable-from-outer-scope-via-global-keyword-in-python

Related

Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Outils