2017-01-26 1 views
0

Ist es möglich, ein Schlüsselwort = Wert als Argument an eine Funktion übergeben, wo der Wert ein Argument von einer anderen Funktion ist?NameError: Name ist nicht definiert, wenn mit Schlüsselwort = Wert

Zum Beispiel

Ich definiere upper_dir

upper_dir='/somefolder' 

definiere ich meine Arbeits dir:

def get_dir(): 

    repo_path = subprocess.call(["pwd"]) 
    return repo_path 

I upper_dir zum create_branch Funktion übergeben:

branch = gitmods.create_branch(hostname, upper_dir) 

Jetzt create_ Zweig braucht die syscmd Funktion aufzurufen, es new_branch und upper_dir vorbei:

def create_branch(hostname, upper_dir): 

    random = randint(100000, 999999) 
    new_branch = 'git checkout -b removes-node-{0}'.format(random) 
    syscmd(new_branch, upper_dir) 

    repo_branch = 'git branch | grep "*"' 
    branch = syscmd(repo_branch) 
    branch = branch.split()[1] 
    return branch 

Mehrere andere Funktionen syscmd nennen, aber sie geben es nur 1 Argument. Ich versuche zu bekommen ‚cwd =‘ auf den Wert von upper_dir

def syscmd(command, current_dir=upper_dir): 

    current_dir=str(get_dir()) 
    popen = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=current_dir) 
    out, err = popen.communicate() 
    out = out.rstrip() 
    return out 

enthaltenen Standard Wenn die syscmd Funktion nicht erhalten upper_dir, ich habe es auf den Wert von get_dir auf Standard will (das ist aktuelles linux-Verzeichnis von pwd

resultierenden Soweit ich das beurteilen kann, kann python Schlüsselwort = Wert Argumente eine Funktion und Standard auf einen bestimmten Wert erhalten, wenn kein Argument angegeben ist. Aber was passiert, wenn Ihr Argument nicht ist eine Zeichenkette, aber stattdessen ein Argument von einer anderen Funktion?

Ich erhalte diese Fehlermeldung:

def syscmd(command, current_dir=upper_dir): 
NameError: name 'upper_dir' is not defined 
+1

'upper_dir' ist nicht definiert, wenn die Datei kompiliert wird. –

+0

Wie löse ich das, wenn upper_dir in __main__ definiert ist, aber die Funktionen, an die es übergeben wird, in einem Modul sind? – ARL

+0

Nebenbei, os.getcwd() 'bekommt auch das aktuelle Arbeitsverzeichnis. – tdelaney

Antwort

3

Die übliche Vorgehensweise ist der Parameter der Standard None und überprüfen Sie es mit einem if Statement setzen:

def syscmd(command, current_dir=None): 
    if current_dir is None: 
     current_dir = str(get_dir()) 
    popen = subprocess.Popen(command, 
          shell=True, 
          stdout=subprocess.PIPE, 
          stderr=subprocess.PIPE, 
          cwd=current_dir) 
    out, err = popen.communicate() 
    out = out.rstrip() 
    return out 
+0

Super, danke. – ARL

2

Sie können dies einfach mehr tun. Popen ist standardmäßig das aktuelle Arbeitsverzeichnis, wenn cwdNone ist und Sie die gleiche Regel verwenden können.

def syscmd(command, cwd=None): 
    popen = subprocess.Popen(command, 
          shell=True, 
          stdout=subprocess.PIPE, 
          stderr=subprocess.PIPE, 
          cwd=cwd) 
    out, err = popen.communicate() 
    out = out.rstrip() 
    return out 

Wenn Ihr Befehl Pfad Manipulationen tat wie os.path.join, könnten Sie ‚‘ als Standard

def syscmd(command, cwd='.'): 
    some_subpath = os.path.join(cwd, 'foo', 'bar') 
    ... 
Verwandte Themen