2017-02-16 55 views
-2

每個人。Python。 NameError:全局名稱未定義(功能無類)

我的Python腳本有問題。這裏有一個問題代碼(有「打印」行只是爲了檢查變量的值):

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 ... 

如果我試圖運行該腳本,我得到這樣的輸出:

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

如果使用「print」命令,那麼處理變量就沒有問題。但是當我試圖從字符串中只獲取特定的字符時,我得到錯誤。

我不明白爲什麼會發生。如果這是Python的正常行爲,那麼如何從行中獲取字符(例如,通過附加變量)?我知道的唯一方法是使用「[]」。

PS沒有區別,如果我會嘗試:

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

UPDATE:編輯的代碼,因爲有一些變量名的問題。 Screenshot

UPDATE2:在我的第一個例子中,我只用了函數的一部分以及它應該如何調用。我自己檢查了這個例子,它的工作原理。但是在完整的代碼中卻沒有。所以我在調用這個函數的那部分代碼中加入了上面的信息。

+0

你認爲'actionWithLevel'的定義在哪裏?它沒有在你當前的代碼中定義。 'actionAndlevel','actionWithlevel'和'actionWithLevel'是不同的變量名稱,如果這讓你感到困惑。 – miradulo

+0

只是爲了澄清:'actionWithLevel'和'actionWithlevel'(注意'l')也是不同的名字。 –

+0

只是一個提示:'match = True如果curValue> actionAndLevel [1:]否則False'可以寫成match = curValue> actionAndLevel [1:]'。請尊重[Python代碼樣式指南](https://www.python.org/dev/peps/pep-0008/)並使用4個空格進行縮進。 – Matthias

回答

0

你在開始時定義actionWithLevel。 然後你繼續比較actionWithlevel ..你從來沒有定義過。這是一個不同的變量還是隻是一個錯字?您使用較低的「l」而不是大寫的「L」。如果你確實想用actionWithlevel(用較低的「l」)進行比較,你必須首先定義它。

0

好的,我確實發現了問題的根源。在定義函數後定義了傳遞給函數的變量之一。這個變量是由argparse創建的(變量的名字是inpValue.criticals)。 當我在def checkForHititngLevel之前移動​​時,腳本停止顯示錯誤。 我不知道爲什麼它有這種行爲,因爲函數中的print命令可以在沒有任何問題的情況下使用此變量。

相關問題