2016-06-10 29 views
1

Gemäß diesem Question's accepted answer, ich verstehe, ich kann nicht reine globale Variablen erstellen. Okay, cool.Zugriff auf eine Variable aus dem äußeren Bereich über ein globales Schlüsselwort in Python

Doch dann geht er auf und sagt:

[..] alles, was Sie tun können, ist eine Variable in einem bestimmten Bereich zu machen. (Wenn Sie eine Variable in den Python-Interpreter machen, und importieren Sie dann andere Module, ist Ihre Variable in dem äußersten Umfang und somit global in Ihrer Python-Session. [..]

Okay, so können wir nicht zuordnen Globals im ursprünglichen Sinne, aber es scheint möglich, auf Variablen im äußersten Bereich aus einem Paket zugreifen, über die global Schlüsselwort, korrekt?

Ich vermisse dann offensichtlich etwas von entscheidender Bedeutung in meinen Bemühungen, auf eine Variable, die über Kommandozeilenargumente an mein Python-Programm übergeben wird

Mein Programm hat die üblichen __main__.py, die Argumentparsing behandelt und führt Code aus meinem Python-Modul backend.

backend hat Code, der auf Eingabe über Befehlszeilenargumente angewiesen ist. Ich scheine jedoch diese Argumente für backend nicht verfügbar zu machen.

Layout Mein Pakets ist:

mypackage 
- __main__.py 
- backend/ 
    -__init__.py 
    -direction.py 

Hier __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 

Und mein backend/direction.py:

global target_dir 
print(target_dir) 

Ausführen dieses eine NameError: 'target_dir' is not defined wirft. Also wo ist die Hütte? Nehme ich hier eine Unmöglichkeit an, oder mache ich einfach eine Deklaration durcheinander?

+0

Wenn wir 'global' sagen, bedeutet dies, dass die Variable irgendwo im äußeren Bereich definiert ist. Es ist für andere Module nicht sichtbar. (Jede Datei, die Sie erstellen, ist ein Modul in Python). Daher müssen Sie das Modul explizit importieren, um auf die Variable zuzugreifen. – thefourtheye

+0

Also, in meinem Fall importiere ich "__main__" in meinem 'direction.py'? Das hört sich nicht hübsch an, noch mag es etwas, das getan werden sollte (?). Ist es akzeptabel, stattdessen eine Variable aus einer Datei als Workaround zu laden? – nlsdfnbch

+0

@ j4ck Wahrhaftig, Sie sollten wahrscheinlich überhaupt keine globalen Variablen verwenden. Wenn Sie sie verwenden müssen, sollten Sie sie am besten auf ein einzelnes Modul beschränken (siehe [PEP8] (https://www.python.org/dev/peps/pep-0008/#global-variable-names)). . –

Antwort

5

global funktioniert nur innerhalb des Moduls in verwendet wird. Sie können auch nicht verwenden global zu erklären eine globale Variable im globalen Bereich (dh. Das Modul scope). Sie würden global im Rahmen einer Funktion verwenden, um anzugeben, dass Sie eine Variable im globalen Bereich und nicht im lokalen Bereich verwenden möchten.

In Python 3, gibt es auch die nonlocal Schlüsselwort, das Sie Sie eine Variable in einem äußeren Umfang ändern möchten, um anzuzeigen, ermöglicht es, das nicht das global/Modul Umfang ist.

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 
0

Ich bin nicht klar, was das Problem tatsächlich ist. Ist es nicht möglich folgendes zu tun?

import backend 

if __name__ == "__main__": 
    # parse arguments 
    backend.argreceive(arguments) 

Als Daniel Roseman vorgeschlagen, wenn es viele Backend-Funktionen, die Zugriff auf diese Variablen sind, dann sollten Sie eine Klasse in Betracht ziehen, und Klasseneigenschaften, die Variablen zu speichern.

class argreceive(): 
    def __init__(self,args): 
     self.args = args 
Verwandte Themen