2016-02-10 29 views
0

這是在我使用的聊天室中運行主持人bot的代碼的一部分。代碼的這一部分是批准某人的請求凸起,但每當我使用命令我得到這個未綁定的本地錯誤... 我已經經歷了這麼多次,我不明白爲什麼我得到它。UnboundLocalError:分配之前引用的本地變量'user'

def approveCam(room, identifier): 
    if not room.bpass: 
     return 

    if type(identifier) in [str, unicode, int]: 
     user = room._getUser(identifier) 
     if not user: 
      return "User " + str(identifier) + " was not found..." 

    if user.broadcasting: 
     return 

    room._sendCommand("privmsg", [room._encodeMessage("/allowbroadcast " + room.bpass), 
    "#0,en" + "n" + str(user.id) + "-" + user.nick]) 

這個問題似乎是在「如果user.broadcasting:」

的代碼工作在以前版本的機器人像這樣

def approveCam(room, user): 
    if type(user) is str or type(user) is unicode: 
     nick = user 
     user = room._getUser(user) 
    if not user: 
     return "User "+nick+" was not found..." 

    if not room.bpass: 
     return 

    room._sendCommand("privmsg", [room._encodeMessage("/allowbroadcast "+room.bpass), 
    "#0,en"+"n"+ user.id+"-"+user.nick]) 

,這裏是我得到的迴應在命令提示符下,當我嘗試運行該命令時。

Traceback (most recent call last): 
File "C:\Users\Ejah\Downloads\Desktop\Tunebot-Master\tinychat.py", line  1262 
in onMessage 
    SETTINGS['onMessageExtend'](self, user, msg) 
File "tunebot.py", line 1316, in onMessageExtended 
    handleUserCommand(room, user, msg) 
File "tunebot.py", line 1722, in handleUserCommand 
    res = botterCommands(room, userCmd, userArgsStr, userArgs, target, 
File "tunebot.py", line 2786, in botterCommands 
    res = approveCam(room, user) 
File "tunebot.py", line 4043, in approveCam 
    if user.broadcasting: 
UnboundLocalError: local variable 'user' referenced before assignment" 
+0

如果你的第二個'if'語句是False(你在比較'identifier'的地方),你不會爲'user'分配任何東西。所以它不存在 –

+1

請正確縮進您的代碼 – donkopotamus

回答

0

更新時identifier類型無效的,一切都會變得清晰你的代碼引發錯誤:

def approveCam(room, identifier): 
    if not room.bpass: 
     return 

    if type(identifier) in [str, unicode, int]: 
     user = room._getUser(identifier) 
     if not user: 
      return "User " + str(identifier) + " was not found..." 
    else: 
     raise ValueError('Invalid type for identifier') 

    if user.broadcasting: 
     return 

    room._sendCommand("privmsg", [room._encodeMessage("/allowbroadcast " + room.bpass), 
     "#0,en" + "n" + str(user.id) + "-" + user.nick]) 
0
user.broadcasting - This is not correct 

此時用戶不存在,因此解釋贏得了」你可以這樣做。在使用它們之前,您必須初始化局部變量。

使用戶成爲具有一定價值的全局變量。

+0

我認爲它已初始化雖然這必須是這麼簡單的事情我沒有得到 – Jah

+0

使用全局變量是一個不好的建議。 – k4ppa

0

可能if type(identifier) in [str, unicode, int]:False,所以if的主體沒有執行,並且user從不初始化。

如果可能,請在第二個if之前初始化user,或重新考慮您的代碼。

P.S.不要使用getter和setter! Python不是Java,如果您確實需要使用它們,請改用屬性。

+0

請勿在'if'語句之前移動'user = room._getUser(標識符)'。類型檢查是有原因的!如果'identifier'屬於無效類型,'getUser'將會出錯。 –

+0

你是對的,編輯。 – k4ppa

+0

嗯..我仍然困惑,我努力在這裏努力去理解 – Jah

相關問題