2017-02-07 7 views
0

Я пытаюсь создать простой бог разного рода, используя discord.py для удовольствия от него. Я изо всех сил пытаюсь понять, как работает асинчио, и у меня проблема с переписыванием/переназначением переменных.переназначение переменных с помощью async/wait?

log_channel = "8765327525217520521501" 

@client.event 
async def on_message(message): 
    if message.author == client.user: 
     return 

    if message.content.startswith('!logchannel'): 
     if message.content == "!logchannel": 
      await client.send_message(message.channel, "```\n logchannel: 
      \r - Changes the channel this bot logs to. 
      \r - Takes the numerical channel ID as an argument 
      \r - E.g. !logchannel 123456789 ```") 
     else: 
      nc = message.content.split()[1] 
      try: 
       await client.send_message(client.get_channel(nc), "Testing new channel to be used for logs...") 
      except discord.NotFound: 
       await client.send_message(message.channel, "No channel was found with that ID.") 
      except discord.Forbidden: 
       await client.send_message(message.channel, "I Don't have permissions to use that channel!") 
      except discord.HTTPException: 
       await client.send_message(message.channel, "There was an error communciating with the server, please try again.") 
      except InvalidArgument: 
       await client.send_message(message.channel, "No channel was found with that ID.") 
      else: 
       await client.send_message(client.get_channel(log_channel), "Logging Channel Updated.") 
       await client.send_message(message.channel, "Logging Channel Updated.") 
       lmsg = 'Logging channel was updated to {} on {}' 
       log.write(lmsg.format(message.channel,logtime)) 
       log_channel = nc 

Попытка перезаписать переменную log_channel вызывает исключение «ссылки перед назначением». Если я не пытаюсь перезаписать, тогда он может получить значение переменной в порядке.

Я предполагаю, что это связано с тем, как работает async, однако я не совсем понимаю это, я использую примеры в качестве руководства.

ответ

0

Это не имеет никакого отношения к async/await. Если вы назначаете имя в любом месте области действия, имя является локальным для всей функции (даже до того, как вы действительно назначили ей). Таким образом, у вас есть две версии log_channel: локальная и глобальная (это локальные маски). Исключение вызвано тем, что вы пытаетесь прочитать локальную в качестве первой строки в случае else, когда она назначается только в последней строке else.

Если вы хотите, чтобы избежать создания локального переопределения для этого имени, добавьте:

global log_channel 

в качестве первой линии внутри вашей функции, а все ссылки (загружает и сохраняет) в log_channel будут использовать глобальную версию.