繁体   English   中英

获取未绑定的本地错误:分配下面引用的局部变量“x”

[英]Getting Unbound local Error: local variable 'x' referenced below assignment

我有一个 python flask 应用程序正在从另一个应用程序接收 webhook。 当它接收到 webhook 时,它会通过执行任务(查找某人的可用性)和响应 web 应用程序来响应。 发回响应时,我收到一个未绑定的本地错误局部变量“响应”,该变量在赋值下方引用。 看起来在该级别调用响应会导致问题。 任何帮助将不胜感激。

from flask import Flask
from flask import request
from flask import make_response
import logging
import json
import random
import os
import importlib
import win32com.client
import pywintypes
import datetime
import pythoncom
from gevent.pywsgi import WSGIServer
from gevent import monkey; monkey.patch_all()
import string

pythoncom.CoInitialize()
logger = logging.getLogger()
logger.setLevel(logging.INFO)
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(message)s')

app = Flask(__name__)

@app.route('/webhook', methods=['POST'])
def webhook():
    req = request.get_json(silent=True, force=True)
    logger.info("Incoming request: %s", req)
    intent = get_intent_from_req(req)
    logger.info('Detected intent %s', intent)

    if intent == "Check Schedule Next":
        pythoncom.CoInitialize()
        emailparam = req.get('queryResult').get('parameters').get('email')
        datetime1 = req.get('queryResult').get('parameters').get('date-time').get("date_time")
        datetime2=datetime1.replace('T',' ')
        datetime3=datetime2.replace("-04:00", "")
        print(datetime3)
        pythoncom.CoInitialize()
        class MeetingRoom:
            def __init__(self, inputDate, duration, locationMail):
                self.inputDate = inputDate
                self.oOutlook = win32com.client.Dispatch("Outlook.Application")
                self.bookings = self.oOutlook.CreateItem(1)
                self.bookings.Start = inputDate
                self.bookings.Duration = duration
                self.bookings.Subject = 'Follow Up Meeting'
                self.bookings.MeetingStatus = 1
                self.roomRecipient = self.bookings.Recipients.Add(locationMail)

            def checkRoomAvailability(self):
               bookingDateTime = datetime.datetime.strptime(self.inputDate, '%Y-%m-%d %H:%M:%S')
                self.roomRecipient.resolve
                myDate = bookingDateTime.date()
                pywintypeDate = pywintypes.Time(myDate)
                availabilityInfo = self.roomRecipient.FreeBusy(pywintypeDate, self.bookings.Duration, True)
                timeAvailability = []
                newTime = pywintypeDate
                # print(newTime)
                currentTime = datetime.datetime.now()
                for isAvailable in availabilityInfo:
                    # print(newTime, " :: ", isAvailable)
                    if isAvailable == "0" and newTime > currentTime:
                        timeAvailability.append(newTime)
                    newTime = newTime + datetime.timedelta(minutes=self.bookings.Duration)

                # print(availabilityInfo)
                # for value in timeAvailability:
                #     print(value)
                try:
                    index = timeAvailability.index(bookingDateTime)
                    print(emailparam, "is available")
                    response = {
                    'fulfillmentText': emailparam
                    }
                    # self.bookings.Save()
                    # self.bookings.Send()

                except ValueError:
                    for timestamp in timeAvailability:
                        if bookingDateTime <= timestamp:
                            break
                print("I dont see availability for", emailparam, "at", bookingDateTime, " but next available time is ", timestamp)
                x = ("I dont see availability for", emailparam, "at", bookingDateTime, " but next available time is ", timestamp)
                response = {
                    'fulfillmentText': x
                }
                # def bookMeetingRoom():

        if __name__ == '__main__':
            meetingRoomObj = MeetingRoom(datetime3, 15, emailparam)
            meetingRoomObj.checkRoomAvailability()
        #response = {
        #    'fulfillmentText': emailparam
        #}

    res = create_response(response)
    return res

def get_intent_from_req(req):
    try:
        intent_name = req['queryResult']['intent']['displayName']
    except KeyError:
        return None

    return intent_name

def get__from_req(req):
    try:
        intent_name = req['queryResult']['intent']['displayName']
    except KeyError:
        return None

    return intent_name


def create_response(response):
    res = json.dumps(response, indent=4)

    logger.info(res)

    r = make_response(res)
    r.headers['Content-Type'] = 'application/json'

    return r

if __name__ == '__main__':
    LISTEN = ('0.0.0.0',8080)
    http_server = WSGIServer( LISTEN, app )
    http_server.serve_forever()

此行在初始化之前引用response

res = create_response(response)

也许确保所有代码路径都初始化response变量?

解决方案

您似乎在错误的 scope 中创建了response object,请将其从 function checkRoomAvailability中删除。

在您创建响应checkRoomAvailability后,在 function checkRoomAvailability 内部,像这样返回它

response = {
                'fulfillmentText': x
            }
return response #ADD THIS LINE

删除这些行

 if __name__ == '__main__':
        meetingRoomObj = MeetingRoom(datetime3, 15, emailparam)
        meetingRoomObj.checkRoomAvailability()

然后添加回 object 创建并在创建响应之前立即调用,如下所示

meetingRoomObj = MeetingRoom(datetime3, 15, emailparam)
response = meetingRoomObj.checkRoomAvailability()
res = create_response(response)
return res

建议

You are lacking some fundamental understanding about how python or scope works so I suggest taking a read friend https://docs.python.org/3.3/reference/executionmodel.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM