2016-09-19 3 views
0

Ich werde versuchen, mit Worten zuerst. Mit Python 3, und ich habe eine Hauptfunktion, die arg als eine Variable setzt. Wenn main() ausgeführt wird, ruft es eine Kopierfunktion auf, die andere Funktionen aufruft. Nachdem diese anderen Funktionen ausgeführt wurden, benötigt copy() die von main() zu Beginn abgeschlossene arg-Variable, um den Abschluss von main() zu ermöglichen.Ich glaube, ich verstehe falsch, wie Variablen aus anderen Funktionen

Von was ich verstehe, ist die Arg-Variable lokal zu main(). Wenn arg von außerhalb der Funktion aufgerufen wird, wird ein NameError zurückgegeben.

ich an diesem Gedanken bin auf der Suche „Ich sollte die ARG Variable von copy() nennen können, weil ich am Main läuft(), die Kopie() aufrufen.

Ich halte an einem Nameerror ankommen. Die letzte Funktion, die ich rufe, bevor ich möchte, dass die Hauptfunktion endet, will wissen, was arg hält, aber arg nicht wie definiert erkennt

Angenommen, alle anderen notwendigen Dinge funktionieren, was muss man tun, um die Kopie() zu bekommen erkenne arg wie definiert

... 


def copy(): 
    x = destination() 
    if os.path.isdir(x): 
     y = backup_destination() 
     if not os.path.isdir(y): 
      shutil.copytree(arg.source, backup_destination) 
      shutil.rmtree(x) 
      shutil.copytree(arg.source, x) 


def main(): 
    parser = argparse.ArgumentParser() 
    parser.add_argument('-s', '--source', type = str) 
    arg = parser.parse_args() 

    if os.path.isdir(arg.source): 
     copy() 

    ... 


if __name__ == '__main__': 
    main() 
+1

Funktionen teilen keine lokalen Variablen. Sie müssen sie bei Bedarf weitergeben. – tcooc

+0

Möchten Sie eine globale Variable definieren? – acornagl

Antwort

3

Die v Ariable ist lokal zu der main-Funktion, um es in copy zu verwenden, müssen Sie es als ein Argument übergeben oder es eine globale Variable machen. versuchen Sie, das letztere um jeden Preis zu vermeiden, außer Sie sind sicher, dass Sie es brauchen, die Verwendung globaler Variablen kann zu vielen Problemen führen, die schwer zu debuggen sind, weil eine Funktion, die Sie vergessen haben, die Variable geändert hat.

def copy(arg): 
    x = destination() 
    if os.path.isdir(x): 
     y = backup_destination() 
     if not os.path.isdir(y): 
      shutil.copytree(arg.source, backup_destination) 
      shutil.rmtree(x) 
      shutil.copytree(arg.source, x) 


def main(): 
    parser = argparse.ArgumentParser() 
    parser.add_argument('-s', '--source', type = str) 
    arg = parser.parse_args() 

    if os.path.isdir(arg.source): 
     copy(arg) 


if __name__ == '__main__': 
    main() 

lesen this für weitere Informationen über variable Bereiche in Python.

+0

Danke. Ich hatte das Gefühl, ich hätte es mit Globals machen können, aber ich verstehe, warum sie nicht benutzt werden sollten. –

1

Jede Funktion läuft in einem anderen Frame. Versuchen Sie locals() in jeder Ihrer Funktionen zu drucken, um die lokalen Variablen zu sehen.

Es gibt 2 Möglichkeiten args zuzugreifen:

Zuerst wird die normale und richtige Art und Weise, Dinge zu tun: Gib es copy() als Argument:

def copy(arg): 
    ... 
def main(): 
    copy(arg) 

Zweitens, die schlechte Art und Weise zu Dinge tun: Analysieren Sie den oberen Rahmen sys._getframe(1) mit:

def copy(): 
    args = sys._getframe(1).f_locals["args"] 
    print(args()) 

def main(): 
    args = 1234 
    copy() 

>>> main() 
1234 

In Bezug auf immer eine Variable aus ad ifferent Umfang, ich glaube, Sie mit diesem Code falsch sind:

def main(): 
    arg = 1234 
    def code(): 
     print(arg) 
    code() 

Hier drin, da die Funktion in einer anderen Funktion definiert wurde, erhält er Zugriff auf die lokalen Variablen ist.

Verwandte Themen