2017-02-16 2 views
-2

alle.Python. NameError: globaler Name ist nicht definiert (Funktion ohne Klasse)

Ich habe ein Problem mit meinem Python-Skript. Hier ist ein Problemcode (es gibt „print“ Linien nur für einen Wert von Variablen Prüfung):

def checkForHittingLevel(name, curValue, checkLine): 
match = bool(False) 
if checkLine is None: 
    return match 
for parametersForCheck in checkLine.split(';'): 
    if name in parametersForCheck: 
    actionWithLevel = parametersForCheck.replace(name,'') 
    # Just to check that it's not empty or there is any problem: 
    print actionWithLevel[0] 
    print type(actionWithLevel) 
    if actionWithLevel[0] == '>': 
    match = True if curValue > actionWithLevel[1:] else False 
    break 
    elif actionWithLevel[0] == '<': 
    match = True if curValue < actionWithLevel[1:] else False 
    break 
    elif actionWithLevel[0] == '=': 
    match = True if curValue == actionWithLevel[1:] else False 
    break 
    elif actionWithLevel[0] == '!': 
    match = True if curValue != actionWithLevel[1:] else False 
    break 
    else: 
    match = False 
    break 
return match 

incArgs.add_argument('-c', '--critical-list', type=str, dest='criticals', 
help='List of critical values for checking data') 
inpValue = incArgs.parse_args() 
[... some code here ...] 
for checkLine in dNetCoreStatsOutData.splitlines(): 
checkStatName = str(checkLine.split()[0]) 
    checkStatValue = int(checkLine.split()[1]) 
    for checkPrevDataLine in oldData.splitlines(): 
    if checkStatName in checkPrevDataLine: 
    prevValue = int(checkPrevDataLine.split()[1]) 
    diffValue = checkStatValue - prevValue 
    if checkForHititngLevel(checkStatName, diffValue, inpValue.criticals): 
    ... code here ... 

Wenn ich versuche, um das Skript auszuführen, erhalte ich diese Ausgabe:

> 
<type 'str'> 
Traceback (most recent call last): 
    File "test.py", line ###, in <module> 
    if checkForHitingLevel(some_name, 20, 'some_name>10'): 
    File "test.py", line ###, in checkForHittingLevel 
    if actionWithlevel[0] == '>': 
NameError: global name 'actionWithlevel' is not defined 

Wenn der Befehl "print" verwendet wird, gibt es keine Probleme mit dem Umgang mit Variablen. Aber wenn ich versuche, nur bestimmte Zeichen von der Zeichenfolge zu bekommen, bekomme ich einen Fehler.

Ich kann nicht verstehen, warum es passiert. Und wenn es ein normales Verhalten der Python ist, wie kann ich dann Zeichen aus der Zeile bekommen (zum Beispiel über zusätzliche Variable)? Der einzige Weg, den ich kenne, ist "[]" zu verwenden.

PS Es gibt keinen Unterschied, ob ich versuchen werde:

CheckResault = checkForHittingLevel(some_name, 20, 'some_name>10;name_2<10') 

UPDATE: bearbeitet Code, weil es ein Problem mit einigen Variablennamen war. Screenshot

UPDATE2: In meinem ersten Beispiel habe ich nur Teil mit Funktion und wie es aufgerufen werden soll. Ich habe dieses Beispiel selbst überprüft und es funktioniert. Aber innerhalb des vollständigen Codes tut es das nicht. Also fügte ich zu den Informationen oberhalb den Teil des Codes hinzu, der diese Funktion aufruft.

+0

Wo denken Sie, dass "actionWithLevel" definiert ist? Es ist nicht in Ihrem aktuellen Code definiert. 'actionAndlevel',' actionWithlevel' und 'actionWithLevel' sind unterschiedliche Variablennamen, falls Sie dadurch verwirrt werden. – miradulo

+0

Nur um klarzustellen: 'actionWithLevel' und' actionWithlevel' (beachten Sie das 'l') sind auch unterschiedliche Namen. –

+0

Nur ein Hinweis: 'match = True wenn curValue> actionAndLevel [1:] else False' kann als 'match = curValue> actionAndLevel [1:]' geschrieben werden. Bitte beachten Sie den [Style Guide for Python Code] (https://www.python.org/dev/peps/pep-0008/) und verwenden Sie 4 Leerzeichen zum Einrücken. – Matthias

Antwort

0

Sie definieren am Anfang actionWithLevel. Dann gehen Sie weiter und vergleichen Sie ActionWithlevel .. die Sie nie definiert haben. Ist es eine andere Variable oder nur ein Tippfehler? Sie verwenden niedrigeres "l" anstelle von Kapital "L". Wenn Sie tatsächlich einen Vergleich mit actionWithlevel (mit niedrigerem "l") machen wollen, müssen Sie es zuerst definieren.

0

Ok, ich habe die Ursache des Problems gefunden. Eine der Variablen, die an die Funktion übergeben wurden, wurde nach dem Definieren einer Funktion definiert. Diese Variable wurde von argparse erstellt (der Name der Variablen lautet inpValue.criticals). Wenn ich Zeilen mit argparse vor def checkForHititngLevel verschoben habe, wurde das Skript nicht mehr angezeigt. Ich weiß nicht, warum es dieses Verhalten hat, weil print Befehl in der Funktion mit dieser Variablen ohne Probleme funktionieren konnte.

Verwandte Themen